关系型数据库、列式数据库和文档数据库——它们不是同一种类型的吗?

8

我知道面向文档的NoSQL数据库是键值模型的“扩展”,因为它允许你查询不止一个查找关键字。但一旦某些东西成为了一个“文档”,我觉得它已经内置了关系模型:

"myJson": {
    "fizz": 4,
    "buzz": "true",
    "widget" : {
        ...etc.
    }
}

对我来说,这个JSON和一个带有“fizz”和“buzz”字段的json_objects表以及与第二个widgets表的外键关系没有区别。而像Cassandra这样的“列式”数据库听起来就像直接的关系/表格型数据库。
所以我想问:文档和列式数据库有什么不同之处,它们与关系型数据库相比有何区别?在哪些情况下它们最适合解决哪些问题,从而使它们在某些特定情况下优于关系型数据库?谢谢!
2个回答

12
首先,我想说你非常正确地指出了NoSql与关系型数据库的区别,因此很难进行比较。话虽如此,两者之间有许多重大区别可以进行比较。 扩展性
尽管您可以对MySql数据库进行分片,但是当RDMS在多台机器上时,强制执行ACID属性会非常具有挑战性,存在问题。NoSql解决方案(如Cassandra)以其无需处理问题即可实现增长的能力而闻名,在某些情况下,可以管理400个节点的集群而不会出现问题。增加Cassandra数据库不仅容易,而且性能不会受到影响。

Schema(less) 模型。
NoSQL 数据库系统是为了管理不遵循固定模式的大量数据而开发的。这意味着例如,如果您希望向Cassandra中的现有列族添加新列,则无需返回并修改列族,因此不需要执行此操作:

ALTER TABLE table_name ALTER COLUMN column_name datatype;

我们可以随着需求增加新的列,最终可能会得到以下“表格”:
 key         | follower1  | follower2   | follower2          
-------------+------------+-------------+-----------
 lyubent     | joeb       | chuckn      | gordonf     
 chuckn      | joeb       | gordonf                   
 gordonf     | chuckn                                 
 joeb        | chuckn     | lyubent     | joeb        

这使得数据模型具有灵活性和易于扩展性,但在此过程中数据变得不太结构化。
速度 NoSql数据库针对高写入速度进行了优化,而RDBMs则旨在实现高读取速度。但即使考虑到这一点,NoSql解决方案在读取方面仍然往往胜过RDBMs系统。这是因为NoSql数据库不实现许多减慢关系模型中读取/写入/更新操作的功能,例如ACID属性和事务。 何时应使用它
  • 你的应用程序/网站需要快速增长,但你想从小开始。
  • 你更关心写入数据而不是读回数据。(大量推文被发布但并非所有人都阅读)
  • 系统的可用性比数据100%更新更重要。(因此如果是银行,您不需要NoSql,但如果您是需要100%运行时间的网站,则可能是一个不错的选择)
  • 如果所写入的数据需要100%成功,但最终的一致性不是问题。

仅供视觉参考,这对我在理解不同的SQL解决方案在数据库世界中的位置以及每个解决方案的目的方面帮助很大。

Database Triad - Availability, Consistency and Partition Tolerance


1
那个图完全是错的,你不能有CA数据库,如果它不具备分区容错性,那么它就不能有A。那个图是由一个误解CAP定理的人制作的。你不能选择2,你必须在C或A之间进行选择。http://codahale.com/you-cant-sacrifice-partition-tolerance这个链接是由Brewer(CAP定理的作者)推特发布的。想一想,分布式MySQL(分片)具有HBase没有的CAP属性?给我展示一个MySQL具有可用性而HBase没有的场景。 - user1944408
RDBMS系统保证一致性,分片使系统对分区具有容错能力。由定理可知,系统因此无法保证可用性,因此RDBMS系统属于CP。 - user1944408
7
@user1944408 批评始终受到赞赏,但您认为图表完全错误是因为HBase和MySql在图表中的位置。您忽略了其他部分。该图像已在多个答案中使用(https://dev59.com/L3E85IYBdhLWcg3wZyqt),请阅读[此文章] (http://blog.nahurst.com/visual-guide-to-nosql-systems),解释为什么将MySql放置在CA上,或者如果您不想...它们用于比较,这是NoSql数据库的指南,而不是RDBMs的指南。 - Lyuben Todorov
1
我知道那篇文章是错误的。它说传统的RDBMS如Postgres、MySQL是CA,这是不正确的。它们没有A属性。我也知道在许多答案中人们使用了这个错误的图表。互联网上有许多博客文章将CAP定理解释为“选择任意两个”,这是错误的,因此Brewer表示他将撰写一篇新论文来澄清这不是真的。他从未在他的论文中说过“选择任意两个”,那只是一个错误的解释。 - user1944408
这只是一次友善的评论,旨在澄清你帖子中一个小点。我给你的其它部分点了个赞。 - user1944408

2
在无模式数据库中,您没有固定的列和类型。
例如,产品“牛仔裤”可以具有属性“价格”,“长度”和“型号”(M / W),但对于产品书籍,则具有属性“价格”,“作者”和“标题”。对于手机,您将拥有“屏幕类型”,“操作系统”等。
在RDBMS中对其进行建模非常困难,因为您不够灵活,用户无法插入任意属性。因此,更容易使用文档数据库来优化这种类型的数据,以便您可以轻松地按属性值搜索和过滤(例如,所有长度> 30且型号= w的产品)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接