NoSQL和传统的RDBMS有什么区别?


71

NoSQL和传统的RDBMS有什么区别?

在过去的几个月中,NoSQL在技术新闻中经常被提及。与传统的RDBMS相比,它最重要的功能是什么?差异发生在什么级别(物理的,逻辑的)?

在哪里使用NoSQL的最佳位置?为什么?

Answers:


61

NoSQL代表“不仅SQL”,而且通常表示该数据库不是关系数据库,在过去的几十年中它非常流行。

NoSQL在最近几年如此流行的主要原因是,当关系数据库从一台服务器中成长出来时,它不再那么容易使用。换句话说,它们在分布式系统中无法很好地扩展。您提到的Google,Yahoo,Facebook和Amazon(我对Digg不太了解)的所有大型网站都有大量数据,并且出于多种原因将数据存储在分布式系统中。可能是数据不适合在一台服务器上,或者对高可用性要求

CAP定理

可以通过CAP定理描述分布式系统的属性。在这三个属性中,您最多只能拥有两个:

  • ç onsistency
  • 一个 vailability
  • 网络P分配的容忍度

Amazon Dynamo使用最终一致性来获取所有三个属性。本文迪纳摩:亚马逊的高度可用的key-value存储是值得学习一下NoSQL数据库和分布式系统时阅读。Amazon Dynamo具有A和P属性。

Google对BigTable采取另一种方法,该方法具有C和A属性。

其他NoSQL数据库

正如我在开始时所写的那样,还有许多其他种类的NoSQL数据库,它们是为不同的需求而设计的。例如图数据库(如Neo4j),文档数据库(如CouchDB)和多模型/对象数据库(如OrientDB)

最后,我想说的是关系数据库将继续流行。它们非常灵活且可维护。但是它们并不总是最佳选择。


1
好,详尽的答案。
TML

NoSQL并不意味着非关系,它只是表示SQL DBMS以外的其他含义。
nvogel

1
在最近的O'Reilly Strata会议上,Mark Madsen似乎在他的数据库历史上创造了对“ NoSQL”的新解释以取代“不仅SQL”。现在是:“否,SQL” ;-)
Lukas Eder 2013年

6
“不仅”是一种改型,早期的NoSQL运动疯狂地针对关系数据库。然后他们袭击了现实世界。
盖乌斯2014年

22

NoSQL是一个非常宽泛的术语,通常称为“不仅仅是SQL”。该术语在非RDBMS社区中不再受欢迎。

您会发现NoSQL数据库没有几个共同的特征。它们可以大致分为以下几类:

  • 键/值存储
  • 受Bigtable启发的数据库(基于Google Bigtable论文)
  • Dynamo启发式数据库
  • 分布式数据库
  • 文件资料库

这是一个很大的问题,但是在本《分布式数据库概览》中已经很好地回答了。

一个简短的答案:

NoSQL数据库可以省去ACID的各个部分,以实现某些其他好处-分区容限,性能,分配负载或通过添加新硬件进行线性扩展。

至于何时使用它们-完全取决于应用程序的需求。


12

NoSQL是一种没有传统RDBMS那样的固定模式的数据库。对于NoSQL数据库,架构由开发人员在运行时定义。他们不针对数据库编写普通的SQL语句,而是使用API​​来获取所需的数据。NoSQL数据库通常可以轻松地在不同的物理服务器上扩展,而无需知道您要查找的数据在哪台服务器上。

但是,要想获得所有这些灵活性,还需要进行一些权衡:与SQL Server,Oracle,DB2,MySQL等RDBMS系统相比,NoSQL数据库缺少很多漂亮的功能。没有Service Broker,事务日志记录,ETL包等。

NoSQL并不是什么新鲜事物。它实际上已经存在了50-60年。那时它被称为COBOL。同样的想法,只是另一个小组提出了。


3
对于许多(全部?)NoSQL数据库,点1是不正确的,除非您已明确告知数据库您不关心写入是否成功。例如,任何Hadoop支持的数据库都会将数据写入三个位置,以防万一。默认情况下,Cassandra将写入三个位置,并在两个位置成功后确认写入成功。
Jeremiah Peschka,2011年

3
进行这些更新时,它如何处理并发?它们之间是否存在分布式类型的事务,还是事前写了ACK,服务器在后台处理其余事务?
mrdenny

并发完全取决于实现。Riak使用矢量时钟来确保并发性,并且在写冲突的情况下,可以将它们返回给调用应用程序以进行解析。其他人使用最后一次写赢。
Jeremiah Peschka 2011年

就写入确认而言-在大多数情况下,只有在OS确认写入后,才会确认写入。您甚至可以请求持久写入的确认,这意味着这些位实际上已刷新到磁盘上,而不是位于OS缓冲区中。MongoDB默认情况下会确认对内存的写操作,但可以配置为要求对磁盘的写操作进行确认。每个产品对复制的处理方式都不同。使用Hadoop,客户端向服务器A写入数据,然后向服务器B写入数据,然后又向C写入数据。一旦C做出响应,写入就完成了,并且客户端获得了写入确认。
Jeremiah Peschka,2011年

在那种情况下,我会纠正。我删除了错误的陈述。我还有其他东西吗?
mrdenny

6

基本上省去了关系设置,主键和外键以及保持事务安全性所涉及的额外开销,通常可以极大地提高性能。但是,这并不是新数据库/数据存储所独有的,例如,MySQL已通过绕过层调整为在“ NoSQL级别”执行。

简而言之,如果您可以承担可能丢失数据的风险,那么通常可以获得令人印象深刻的性能。大多数NoSQL系统都这样做。例如,MongoDB在方便时会暂存要写入的数据更改。数据本身是安全和事务安全的,但保留在易失性存储(内存)中。如果您断电,则不能100%确保您没有丢失数据,或者您没有损坏的数据。

在安全性和性能之间进行权衡。


5

一个好的起点是Wikipedia条目。本质上是将一个表中的数据与另一个表中的数据相关联,而是将它们存储为键值对,并且没有数据库架构,而是由代码来处理。

一些站点同时使用NoSQL和典型的RDBMS服务器,但存储不同的数据。因此,您不必选择一个。


可以通过去WP回答这个问题的大部分,这一事实使我在思考这里的答案时会rub下巴。我认为这也是一个“填充问题”,但这实际上是我们现在所拥有的全部。
jcolebrand

1
这里的重要说明是,在数据库/服务器基础结构中避免使用关系(外键)支持可以减轻数据库/服务器维护参照完整性的负担和锁定管理开销。折衷的结果是,将引用完整性,一致性和其他ACID问题推送到应用程序。许多应用程序从中受益而不是受到限制。(必须将某些应用程序插入客户端/服务器模型中)。
吉姆·丹尼斯

0

我在MongoDB NoSQL数据库和Oracle上进行了大量工作。

架构图

SQL数据库具有其自己的预定义架构来存储结构化数据。

在NoSQL数据库中,没有预定义的架构,此处架构是基于数据元素的最动态的元素。

可扩展性

SQL数据库是垂直可伸缩的,这意味着如果要扩展SQL基本数据库,则需要增强安装DBMS系统的硬件。有时这是可伸缩性限制的地方。

NoSQL数据库是水平可伸缩的,这意味着如果要扩展它,我们需要添加更多的节点并根据自己的需要和所需的功能创建分发网络。这就是它们减少数据库负载的方式

资料检索

在基于SQL的数据库中,要定义和处理数据,我们可以使用SQL(结构化查询语言),它现在非常强大。

在NoSQL数据库方面,查询集中在集合和文档上。有时,它称为UnQL(非结构化查询语言)。这仍处于发展阶段,因此每个NoSQL数据库的供应商各不相同。

有关关键差异的更多信息,请访问我的博客:SQL和NoSQL数据库之间的差异

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.