NoSQL与传统RDBMS有什么区别?

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

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

#1 楼

NoSQL代表“不仅仅是SQL”,通常表示该数据库不是关系数据库,在过去的几十年中非常流行。
最近几年NoSQL如此受欢迎的原因主要是,当关系数据库由一台服务器扩展而来,不再易于使用。换句话说,它们在分布式系统中无法很好地扩展。您提到的Google,Yahoo,Facebook和Amazon(我对Digg不太了解)的所有大型网站都有大量数据,并且出于多种原因将数据存储在分布式系统中。可能是因为数据不适合一台服务器,或者是对高可用性的要求。
CAP定理
CAP定理可以描述分布式系统的属性。在这三个属性中,您最多只能拥有两个:


C兼容性

网络可用性
网络P分配的容忍度
/>
Amazon Dynamo使用最终一致性来获取所有三个属性。在学习NoSQL数据库和分布式系统时,《 Dynamo:Amazon的高可用键值存储》一文值得一读。 Amazon Dynamo具有A和P属性。
Google对BigTable采取了另一种方法,即具有C和A属性。
其他NoSQL数据库
正如我在一开始所写的那样,还有许多其他一种针对不同需求而设计的NoSQL数据库。例如。诸如Neo4j之类的图形数据库,诸如CouchDB之类的文档数据库以及诸如OrientDB之类的多模型/对象数据库。
最后,我想说一下关系数据库将继续流行。它们非常灵活且可维护。但是它们并不总是最佳选择。

评论


好,详尽的答案。

–TML
2011年1月5日,下午6:32

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

– nvogel
2011年3月31日12:04

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

–卢卡斯·埃德(Lukas Eder)
2013年12月14日20:01



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

– Gaius
2014年5月7日在8:27

#2 楼

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

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


键/值存储
Bigtable启发数据库(基于Google Bigtable论文)
Dynamo启发数据库
/>分布式数据库
文档数据库

这是一个很大的问题,但是在本《分布式数据库概览》中,它已经得到了很好的回答。 br />
NoSQL数据库可以省去ACID的各个部分,以实现某些其他好处-分区容限,性能,分配负载或通过添加新硬件来线性扩展。

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

#3 楼

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

但是,要实现所有这种灵活性都需要权衡取舍:NoSQL数据库非常漂亮与RDBMS系统(如SQL Server,Oracle,DB2,MySQL等)相比,该功能缺少。没有Service Broker,事务日志记录,ETL包等。

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

评论


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

–耶利米·佩斯卡(Jeremiah Peschka)
2011年1月3日,21:16

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

–mrdenny
2011年1月3日,21:48

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

–耶利米·佩斯卡(Jeremiah Peschka)
2011年1月3日在22:09

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

–耶利米·佩斯卡(Jeremiah Peschka)
2011年1月3日,22:14

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

–mrdenny
2011年1月5日,1:11

#4 楼

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

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

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

#5 楼

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

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

评论


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

–jcolebrand♦
2011年1月5日,下午4:58

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

–吉姆·丹尼斯(Jim Dennis)
2011年3月31日22:51

#6 楼

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

架构

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

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

可伸缩性

SQL数据库是垂直可伸缩的,这意味着如果要扩展SQL基本数据库,则需要在硬件上进行增强DBMS系统已安装。

NoSQL数据库是水平可伸缩的,这意味着如果要对其进行伸缩,我们需要添加更多的节点并根据自己的需要创建分发网络,并且所需功率。这就是它们减少数据库负载的方式。在基于SQL的数据库中,要定义和操作数据,我们可以使用SQL(结构化查询语言),这非常有用。如今功能强大。

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

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