SQL vs NoSQL 没有硝烟的刀兵!

宣称:本文译自SQL vs NoSQL The
Differences
,如需转发请讲明出处。


SQL(结构化查询语言)数据库作为一个关键的数目存储机制已经超先生越40个新春了。随着web应用和像MySQL、PostgreSQL和SQLite那一个开源项的起来,SQL使用量大大扩展。

NoSQL数据库在20世纪60年份就早已面世了,但近来因为MongoDB、CouchDB,Redis和Apache
卡桑德拉等才惨遭普遍的关切。

您会发觉众多学科都会解释什么按照你的兴趣选择去行使SQL依旧NoSQL,然则很少探讨为何应该去挑选它。我希望能够填补这一空白。在那篇小说中,我们将介绍中央的出入。在稍后的两次三番的稿子中,我们将翻开一些卓越的情况,并规定最佳的选拔。

大部分的例证都适用于近日盛行的MySQL SQL和MongoDB
NoSQL数据库系统。其余SQL/NOSQL数据库都是看似的,但会有细小的不相同和语法特征。

SQL和NoSQL的圣战

在大家伊始以前,先校勘一些所谓的神话…

  • 神话1:NoSQL将取代SQL

那样说就好比说船将被车替代,因为它是新的技能。SQL和NoSQL做的是同一的事:数据存储。它们利用的格局差别,那可能回帮组或堵住你的门类。固然觉得技术更新,并时不时在近来上头条,NoSQL不是SQL的替代品——而是一种接纳。

  • 神话2:NoSQL比SQL更好或更坏

一对项目更合乎选取SQL数据库,一些更符合NoSQL,而有的足以相互交替使用。那边作品不会是SitePoint
Smackdown,因为您不可能在装有方面都施用相同的广泛性即使。

  • 神话3:SQL和NoSQL天壤之别

那不一定是个事实。一些SQL数据库拔取NoSQL的特性,反之亦然。选取可能会变得越发混淆,NewSQL混合数据库可能会在未来提供一些妙不可言的选项。

  • 神话4:语言/框架决定了使用什么的数据库

俺们早已习惯了技术堆,比如——

  • LAMP: Linux, Apache, MySQL (SQL), PHP
  • MEAN: MongoDB (NoSQL), Express, Angular, Node.js
  • .NET, IIS and SQL Server
  • Java, Apache and Oracle.

有履行的、历史的和小买卖的案由来解释那几个stack的向上——但无法认为它们就是规则。你能够在你的PHP或.NET项目中动用MongoDB
NoSQL数据库。你可以在Node.js中连连MySQL或者SQL服务器。你恐怕没有找到很多科目和资源,可是是您的必要决定数据库的项目——而不是所谓的语言。

(有句话是如此说的,不要让生活有目地为难自己!采用一个不平凡的技术结合或者SQL和NoSQL组合是实用的,但不方便的是找到支持和特聘有经验的开发者)

有了那样的想法,大家来看望主要的反差。

SQL表VS NoSQL文档

SQL数据库提供相关数据表的储存。例如,假设您有一个网上书店,图书的音信将会被添加到一个book的表中:

图片 1

每一行是一个例外的记录。设计是刚性的;你不可能使用同一个表来存储差其他新闻,或者在一个数字格式输入字符。

NoSQL数据库存储JSON格式的字段值对文档,比如:

{

ISBN: 9780992461225,
title: "JavaScript: Novice to Ninja",
author: "Darren Jones",
format: "ebook",
price: 29.00
}

  

一般的文档可以储存于一个聚集里,那看似于一个SQL表。不过你可以储存任何数据在此外文档里;而NoSQL数据库永远不会抱怨,例如:

{

ISBN: 9780992461225,
title: "JavaScript: Novice to Ninja",
author: "Darren Jones",
format: "ebook",
price: 29.00
}

 

SQL表创造一个严格的数量模板,因而很难犯错误。NoSQL尤其的灵敏和超生,但能够存储任何数据可能会造成一致性的题目。

SQL模式VS NoSQL无模式

在一个SQL数据库中,除非您在指定情势中定义了表格和字段格式,不然不可以助长数据。该情势还足以涵盖其余的新闻,例如——
主键——唯一的标识符,如ISBN,适用于单个记录。
目录——常常被询问的字段,用来支援快熟搜索。
提到——数据字段之间的逻辑连接
成效——如触发器和储存进度

您的数目格局必须在其余生意逻辑可以被支付去处理多少前被规划出来并贯彻。达成后方可走路一些更新,但无法一呵而就大的改观。

在一个NoSQL数据库,数据足以随时遍地被添加。没有要求去制定一个文档设计,甚至集合前端。例如在MongoDB,上面的话语将在新的book集合创制一个新的文档,倘使那几个文档此前未曾被成立过:

db.book.insert(

ISBN: 9780994182654,
title: "Jump Start Git",
author: "Shaumik Daityari",
format: "ebook",
price: 29.00
);

 

(MongoDB会给每个集合内的文档自动抬高唯一的_id值。你也许任然想要定义索引,借使必要的话可以稍后进行。)

假如一个种类开首数据需要很难去确定,那么NoSQL数据库可能越来越的契合。有句话说,不要为懒散而创立困难:忽略了在档次中设计适合的数据库的要害将会在事后导致众多的麻烦。

SQL规范化VS NoSQL反规范化

比方大家要向书店数据库中添加出版商音信。一个纯粹的出版商可以提供多个标题,在一个SQL数据库里,大家创造一个新的publisher表:
图片 2
俺们接下去可以伸张publisher_id到book表,这些表是publisher.id引用。
图片 3
这最大限度的压缩多少的冗余;大家毫不再行每本书的出版商音讯——仅仅只用索引。那种技能可以称呼规范化,并有实在的利益。大家只用更新单一的出版商而不用改变总体book数据。
在NoSQL中,大家也能够选用规范化技巧。在book集中的文档——

{

ISBN: 9780992461225,
title: "JavaScript: Novice to Ninja",
author: "Darren Jones",
format: "ebook",
price: 29.00,
publisher_id: "SP001"
}

 

——在一个出版商集合中引用一个文档:

{

id: "SP001"
name: "SitePoint",
country: "Australia",
email: "feedback@sitepoint.com"
}

 

唯独,那并不总是实惠的,原因在底下很显然。大家也许选取反规范化我们的文档,重复每本书的出版商音讯:

{

ISBN: 9780992461225,
title: "JavaScript: Novice to Ninja",
author: "Darren Jones",
format: "ebook",
price: 29.00,
publisher: {
    name: "SitePoint",
    country: "Australia",
    email: "feedback@sitepoint.com"
}
}

 

那能够加速查询的进程,但在七个记录中立异出版商音信将会明确变慢。

SQL关系连接VS NoSQL

SQL查询提供了一个精锐的JOIN条款。咱们可以运用单个SQL语句获取不一致表中的相干数据。例如:
SELECT book.title, book.author, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;
那将再次来到所有的书名、小编和相关出版商名称。

NoSQL没有一样的JOIN,有SQL的阅历的或是会惊叹.
如若我们选取上述的规范化集合,大家将须求取得具有的book文档,检索所有的相干publisher文档,并手动在程序逻辑中一而再两者。那就是反规范化平常是必不可少的一个原因。

SQL VS NoSQL数据完整性

绝大部分SQL数据库允许你选择外键约束去强制性数据完整性(除非您仍在拔取旧的,在MySQL已不存在的MyISAM存储引擎)。大家的书店可以——

  •  确保所有的书都有一个一蹴而就的publisher_id编码,那几个编码在
    publisher表中都有十分的条目
  •  假设一个或五个书被分配给它们,则出版商不可以被剔除。

情势强制数据库坚守这个规则。开发者或用户则不可以扩展、编辑或者移除可能滋生无效数据或孤立的数目

如出一辙数据完整性选项在NoSQL数据库中不可用;你可以储存所有你想囤积的事物。理想状态下,单一文档将改为项目具有音信的绝无仅有来源。

SQL VS NoSQL事务

在SQL数据库中,五个或多少个更新可以在同一个工作中推行——一个all-or-nothing的包装有限支撑成功或破产。例如,要是大家的书店包括了order和stock表。当一本书被预定时,大家在order表添加一条记下并缩减stock表中的库存数。假若大家独家地实践那多少个立异,一个或许成功别的一个会失利——因此大家的数量会不联合。在一个作业中放置相同更新可以有限支撑同时打响或失利。

在NoSQL数据库中,单个文档的改动是细微的。换句话说。假若您正在文档中更新多个值,要不三个值都是水到渠成的,要不多个值都维持不变。可是,却从未相等的事情去立异不一样的文档。有近似的选项,然则,在写这一个的时候,必须在你的代码中手动处理。

SQL VS NoSQL CRUD 语法

创制、读取更新和删除数据是上具备数据库系统的底子。本质上——

  •  SQL是一个轻量级的陈述性语言。那是分外强劲的,并曾经改为一个国际化的规范,纵然大多数体系完结略有分化的语法。
  •  NoSQL数据库使用与JSON类似
    JavaScripty-looking查询!基本操作很不难,但嵌套的JSON对于复杂的查询会变得越来越的糊涂。

简易的比较:
图片 4
图片 5
图片 6
图片 7

SQL VS NoSQL性能

那恐怕是最有争议的相比,NoSQL平日被认为比SQL更快。那并不奇怪;NoSQL越发简约的反规范化存储允许你使用单个请求去在所有音讯中询问一个特定的品类。不需求拔取相关的JSON或复杂的SQL查询。

也就是说,你的花色统筹和数量须求将发生最大的震慑。一个得天独厚设计的SQL数据库必然会比一个统筹很差的NoSQL表现自己,反之亦然。

SQL VS NoSQL缩放

乘机你的数量的增强,你可能会发觉在三个服务器往日分配负载是很要求的。这对于SQL为根基的系统或者很伤脑筋。怎样分配相关的数额吧?聚类可能是最简便易行的挑选;四个服务器访问同一的中心存储——但固然如此也会设有挑衅。

NoSQL的简约数据模型可以让这么些进程不难很多,许多一早先就成立了缩放功效。那是一个概论性的,所以一旦遇上那种气象请去咨询专家观点。

SQL VS NoSQL实用性

最终,大家来考虑安全和体系的问题。最出名的NoSQL数据库才存在了几年;他们比更成熟的SQL产品更易出现问题。许多的题目早就被暴露,但半数以上要么归咎为一个问题:知识。

开发人员和系统管理员对于新的数据库系统有较少的经历,所以错误经常暴发。采用NoSQL是因为它感到会更快,或因为您想去防止架构设计而致使将来的题材。

SQL VS NoSQL的总结

SQL和NoSQL数据库用差距的艺术做同样的事情。从一个切换来另一个是唯恐的,但是某些安排得以节省很多的刻钟和钱财。

更适合SQL的项目:

  • 可预先确定的逻辑关系离散数据的要求
  • 数据完整性是必不可少的
  • 有良好开发经验和支持的标准基础技术

更适合NoSQL的项目:

  • 不相关的、不确定或不断变化的数据要求
  • ``更加简单宽松的项目对象,可以立即编码
  • ``速度和扩展性是必要的

在这一个书店例子的背景下,SQL数据库是最实用的选项——尤其是当大家推荐电商设施,必要强大的事体辅助。

由于我们云巴是做跨设备平台的新闻服务的,对数据存取的进程和增添必要卓殊高,NoSQl对大家的话是最合适的。

相关文章