为什么我应该使用基于文档的数据库而不是关系数据库?


Answers:


167

也许你不应该:-)

第二个最明显的答案是,如果您的数据不是关系数据,则应使用它。这通常表现为没有简单的方法将您的数据描述为一组列。一个很好的例子是一个数据库,您可以在其中实际存储纸质文档,例如通过扫描办公室邮件。数据是扫描的PDF,并且您有一些始终存在的元数据(在文档中扫描,按文件类型扫描)以及有一段时间可能存在的许多元数据字段(客户编号,供应商编号,订单编号,保留在文件上, OCRed全文,等等)。通常,您不预先知道在未来两年内将添加哪些元数据字段。与关系数据库相比,诸如CouchDB之类的事情对于这种数据而言要好得多。

我个人也喜欢这样一个事实,除了HTTP客户端外,我不需要CouchDB的任何客户端库,HTTP客户端如今已包含在几乎所有编程语言中。

可能最不明显的答案:如果您不觉得使用RDBMS感到痛苦,请继续使用它。如果您总是需要解决RDBMS才能完成工作,那么面向文档的数据库可能值得一看。

有关更详尽的列表,请查看Richard Jones的这篇帖子


1
我两年来从未见过任何数据库架构与我们最初使用的原始架构类似……因此,一切都相等(不是),您应该始终使用无架构数据库=面向文档的数据库;我认为这是一个颇具误导性的名称...
2012年

3
@ int3如果无法将数据描述为一组列,应该如何对所述数据编写智能查询?
克莱·史密斯

46

CouchDB(来自他们的网站

  • 可通过RESTful JSON API访问的文档数据库服务器。通常,关系数据库不是通过REST服务简单访问的,而是需要更复杂的SQL API。通常这些API(JDBC,ODBC等)非常复杂。REST非常简单。

  • 临时和无模式,具有统一的地址空间。关系数据库具有复杂的固定架构。您可以定义表,列,索引,序列,视图和其他内容。Couch不需要这种复杂,昂贵,脆弱的高级计划。

  • 分布式,具有健壮的增量复制以及双向冲突检测和管理功能。一些SQL商业产品提供了此功能。由于SQL API和固定的架构,这是复杂,困难且昂贵的。对于Couch,它看起来既简单又便宜。

  • 可查询和可索引,具有面向表格的报告引擎,该引擎使用Javascript作为查询语言。SQL和关系数据库也是如此。这里没有新内容。

所以。为什么选择CouchDB?

  • REST比JDBC或ODBC更简单。
  • 没有一个架构比架构更简单。
  • 以看起来简单且便宜的方式进行分发。

12
虽然我是NoSQL数据库的忠实拥护者,但第一个主张(REST比JDBC更简单)令人怀疑。
2012年

2
REST协议对我来说似乎很简单,因为它只是HTTP:无状态,很少的方法等,等等。也许JDBC很简单。它似乎并不简单,仅基于有状态。
S.Lott 2012年

5
@ S.Lott答案不是应该更通用吗?而不是仅仅针对CouchDb?
Pacerier

“脆弱的高级计划” vs是什么?以我的经验,替代方案是无计划,这会导致意粉数据结构一时兴起地被修改。
蒂杰·卡顿

26

愚蠢地存储和服务其他服务器数据。

在过去的几周中,我一直在使用一个生命周期应用程序,该应用程序轮询我的提要(美味,flickr,github,twitter ...)并将其存储在沙发上。benchdb的优点在于,它使我可以将原始数据保持在其原始结构中,而没有任何开销。我向每个文档添加了一个“类”字段,存储了源服务器,并为每个源编写了一个javascript渲染类。

概括地说,每当您的服务器与另一台服务器通信时,最好使用无模式存储,因为您无法控制该模式。另外,couchdb使用服务器和客户端的本机协议-JSON用于表示,HTTP REST用于传输。


为什么不将它们存储在一个文件中,或将每个Feed存储在一个文件中?
j_random_hacker 2010年

6
因为ouchdb还允许您使用map / reduce创建有趣的视图。例如,我可以基于数据源创建视图,也可以计算每个数据源的总数。
daonb 2010年

4
这是一个亮点……如果您正在使用数据并且无法控制入站数据模式,请使用文档存储。
约书亚·罗宾逊

1
这是我听到的关于NoSQL数据库价值的第一个真正令人信服的论点
Caleb McNevin

20

想到快速的应用程序开发。

当我不断发展自己的架构时,由于必须在MySQL / SQLite中维护该架构而使我不断感到沮丧。尽管我对CouchDB的工作还不多,但我喜欢在RAD流程中发展模式如此简单。

您可能不希望使用非关系数据库的情况是,当您拥有许多多对多关系时;我还没弄清楚如何围绕这些类型的关系创建良好的MapReduce函数,尤其是如果您需要在连接关系中包含元数据时。我不确定,但是我不认为CouchDB Map函数可以在数据库上调用它们自己的查询,因为这可能会导致无限循环。


1
好点。文档(和其他无模式)数据存储非常适合快速的早期开发。但是,出于同样的原因,它们非常适合早期原型制作,因此对于稳健的生产应用来说是个问题。
蒂杰·卡顿

6

当您不需要将数据存储在每个记录的字段大小统一的表中时,请使用基于文档的数据库。相反,您需要将每个记录存储为具有某些特征的文档。可以随时将任意长度的任意数量的字段动态添加到文档中,而无需先“修改表”。基于文档的字段也可以包含多个数据。


1

详细阐述smdelfin:灵活性。您可以将数据存储为任何结构(非结构化且全部结构化),并且每个文档都可以完全不同。CouchDB特别有用,因为有了它们的“视图”索引,您可以过滤出特定的文档,并在需要数据库的那些子集时仅查询该视图。

文档数据库以JSON格式存储数据的最大优点是:这是JavaScript的本机格式。因此,JavaScript Web应用程序与CouchDB配合得非常好。我最近制作了一个网络应用程序,该应用程序利用CouchDB并迅速发展,同时还能够处理不断变化的数据结构。


0

与关系数据库相比,基于文档的数据库具有很大的优势,因为它们不需要先定义架构即可输入任何数据。

另外,如果数据不是关系数据并且不能存储在表中而是一组图像(例如报纸),则应使用文档数据库。

另一个优点是易于在Web开发中使用基于文档的数据库。有关更深入的NoSQL数据库模型比较,请查看以下来源:https ://arxiv.org/ftp/arxiv/papers/1509/1509.08035.pdf

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.