SQL vs NoSQL 没有硝烟的战乱!

扬言:本文译自SQL vs NoSQL The
Differences
,如需转载请表明出处。


SQL(结构化查询语言)数据库作为一个重大的多寡存储机制已经超越40个年头了。随着web应用和像MySQL、PostgreSQL和SQLite这个开源项的起来,SQL使用量大大扩充。

NoSQL数据库在20世纪60年份就早已面世了,但近日因为MongoDB、CouchDB,Redis和Apache
卡Sandra(Cassandra)(Cassandra)等才惨遭普遍的关怀。

您会发觉众多科目都会解释什么遵照你的兴味采纳去行使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混合数据库可能会在未来提供部分有趣的挑选。

  • Node.js,神话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的表中:

Node.js 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表:
Node.js 2
我们接下去可以追加publisher_id到book表,那多少个表是publisher.id引用。
Node.js 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对于复杂的询问会变得尤为的眼花缭乱。

概括的可比:
Node.js 4
Node.js 5
Node.js 6
Node.js 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对咱们的话是最合适的。