基于文档的数据库与关系数据库的优点/缺点


76

我一直在尝试查看是否可以使用基于文档的数据库(在本例中为CouchDB)满足某些要求。两个通用要求:

  • 具有某些具有唯一索引的字段的实体的CRUD
  • 像eBay这样的电子商务网络应用(此处有更好的说明)。

而且我开始认为基于文档的数据库并不是满足这些要求的最佳选择。此外,我无法想象基于文档的数据库的用途(也许我的想象力太有限了)。

当我尝试使用面向文档的数据库来满足这些要求时,是否可以向我解释我是否要求榆树梨


2
“向榆树求梨” =问不可能。(杰森的链接已死。)
丹尼斯

Answers:


36

您需要考虑如何以面向文档的方式处理应用程序。如果仅尝试复制在RDBMS中建模问题的方式,那么您将失败。您可能还需要权衡取舍。([[编辑:不确定如何将其与参数联系起来,但是:]:请记住,CouchDB的设计假设您将拥有一个活跃的群集,其中包含许多随时可能发生故障的节点。您的应用程序将如何处理一个数据库节点从在它下面?)

考虑的一种方法是想象您没有任何计算机,只有纸质文档。您将如何使用随身携带的纸屑来创建高效的业务流程?如何避免瓶颈?如果出现问题怎么办?

您应该考虑的另一个角度是最终的一致性,最终您将进入一致状态,但是一段时间内可能会不一致。这是RDBMS领域的一种厌恶,但在现实世界中极为普遍。规范的交易示例是从银行帐户转移资金。在现实世界中,这是如何实际发生的-通过一次原子交易或通过不同的银行相互发行贷方通知书?写支票会怎样?

因此,让我们看一下您的示例:

  • 对具有某些具有唯一索引的字段的实体的CRUD。

如果我用CouchDB术语正确理解了这一点,那么您想要一个文档集合,其中某些命名值在所有这些文档中都保证是唯一的吗?这种情况通常不被支持,因为文档可能创建在不同的副本上。

因此,我们需要研究现实世界中的问题,看看是否可以对此建模。您真的需要它们独特吗?您的应用程序可以处理具有相同值的多个文档吗?您需要分配一个唯一的标识符吗?您可以确定地执行此操作吗?需要此操作的常见方案是需要唯一的顺序标识符。这在复制环境中很难解决。事实上,如果唯一ID是需要时间创造了它不可能是关于严格顺序的,如果你需要的ID,立竿见影。您需要至少放松这些约束之一。

  • 像ebay这样的电子商务网络应用

我不确定要在此处添加什么,因为您对此帖子的最后评论是说“非常有用!谢谢”。此处概述的方法中是否仍然缺少某些仍导致您遇到问题的方法?我以为MrKurt的回答很完整,我添加了一些增强功能以​​减少争用。


如何将UUID用于无共享的全局唯一标识符?人们通常在文档数据库世界中这样做吗?
Paul Legato

@Tim Lovell-Smith + kerrr +1我喜欢纸质文档的真实世界比较。:)注意到CouchDB需要/假设集群是很重要的一点。同样好的一点是,不一定总是保证一致性。对于作为RDB支持者的我来说,这是(当然还有其他规则):“如果一致性至关重要,请使用关系数据库。” 对?(注意:我目前正在开始一个新项目,我想决定是使用NoSQL还是RDB。)
try-catch-finally

12

是否需要规范化数据?

  • 是:使用关系。
  • 否:使用文件。

13
我知道您很久以前就回答了这个问题,但是我想我会问...您何时需要“正常化”?规范化不是一种选择/最佳实践吗?
马特·格兰德

1
@Matt,数据标准化只是一个工具。标准化数据的程度是在数据库设计工作和一致性维护工作之间进行权衡的。
pyon

5
我不同意这是区分使用哪种数据库模型的好方法。在关系数据库和基于文档的数据库中,规范化都是不可避免的。我的直觉是,交易规模更有可能是有效的区分。
Munhitsu 2011年

您在这里归一化是什么意思?如果我正确地理解了标准化是达到目的的一种手段,那么您的答案似乎并不完整...
Tim Lovell-Smith

这是我第二次阅读此经验法则(以查看标准化的必要性)。但是实际上对我来说,作为RDB支持者,我一直试图了解下一个项目应该使用基于文档的文档还是关系数据库来实现,因此这种“规则”无济于事,因为如果我愿意,我可以设计我的RDB(非常)非规范化(有些工程师甚至从性能角度建议这样做)。
try-catch-finally

8

我在同一条船上,此刻我爱着沙发床,我认为整个功能风格很棒。但是,确切的说我们什么时候才开始在应用程序中使用它们。我的意思是,是的,我们所有人都可以非常迅速地开始开发应用程序,而不会因将标准格式遗留在路边而不使用模式而烦恼不已。但是,要表达一个短语“我们站在巨人的肩膀上”。有充分的理由使用RDBMS进行规范化和使用模式。我的老甲骨文负责人正在思考无格式的数据。

我对ouchdb的主要惊奇因素是复制工作和版本控制系统协同工作。

上个月,我一直在绞尽脑汁,试图弄清beddb的存储机制,显然它使用B树,但不存储基于常规格式的数据。这是否意味着它真的很聪明,并且意识到可以复制数据位,所以只需要为该B树条目创建一个指针?

到目前为止,我正在考虑将XML文档,配置文件,资源文件流式传输到base64字符串。

但是,我是否可以将ouchdb用于结构数据。我不知道,对此有什么帮助。

在存储RDF数据甚至自由格式文本时可能很有用。


6

一种可能是拥有一个主要的关系数据库,用于存储可以通过其ID检索的项目定义,以及一个用于描述这些项目的描述和/或规格的文档数据库。例如,您可能有一个带有Products表的关系数据库,其中Products表具有以下字段:

  • 产品编号
  • 描述
  • 单价
  • 批量
  • 技术指标

并且“规格”字段实际上将包含对具有产品技术规格的文档的引用。这样,您可以两全其美。


2
SQL Server 2008是可以同时执行两个操作的数据库示例(使用FILESTREAM数据类型)。
约翰·桑德斯

哇。很棒的功能。(我从未使用过SQL Server2008。)
pyon 2010年

仅仅能够存储松散的“文档”或文件并不能使其成为面向文档的数据库系统。真正的面向文档的数据库为您提供有效地索引和使用文档的功能。
2013年

@ TimLovell-Smith如果存在任何结构,则最有利地利用关系数据库(或者更好的是使用分类数据库:math.mit.edu/~dspivak/informatics/talks/CTDBIntroductoryTalk)。我所提倡的是在数据的结构化和非结构化部分之间建立清晰的分界。
pyon

@ TimLovell-Smith怎么样?您提到了“索引和使用文档的功能”。索引是结构,因此,正如我所说,“索引”是使用关系数据库的最大收益”,即使文档的实际内容不是。
2013年

4

基于文档的数据库最适合存储文档。Lotus Notes是一个常见的实现,Notes电子邮件是一个示例。对于您正在描述的内容,例如电子商务,CRUD等,实际数据库是为存储和检索被索引的数据项/元素(而不是文档)而设计的。


9
我不同意 文档数据库并非主要用于存储文档。它用于存储分层数据(JSON或XML)。您可以使用例如MongoDB索引嵌套的JSON字段和JSON数组。您可以在MongoDB(gridfs)中存储文档(文件),但是如果您不能在MongoDB中存储文档(文件),则MongoDB仍然有用。我认为MongoDb应该称为JSON db,而不是文档db。
Theo 2010年

1
根据Wikipedia的“面向文档的数据库”条目,“ ...使用XML,YAML或JSON进行信息存储具有类似于面向文档的数据库的优点”,但它们并非同一个人。文档数据库最初是设计用来存储文档的。如果将它们用于其他数据,将不会获得与将文档存储在关系数据库中相同的最佳性能/用法。这经常发生。人们将关系数据存储在文档数据库中,然后抱怨文档数据库有多糟糕。如果您滥用它们,可以。
吉姆·安德森

1
此后,Wikipedia条目en.wikipedia.org/wiki/Document-oriented_database进行了更新,值得一看,以确认面向文档的数据库确实比实际文件的文件柜更多。
ZsoltTörök2010年

有趣。近年来,面向文档的数据库似乎已经“进化”了许多,比我认为的初衷还要多。
吉姆·安德森

2

关于CRUD:整个REST范例直接映射到CRUD(反之亦然)。因此,如果您知道可以使用资源(可通过URI识别)和一组基本操作(即CRUD)来对需求进行建模,那么您可能已经非常接近基于REST的系统,该系统有很多面向文档的系统可以提供的盒子。


1
我认为将CRUD与REST进行比较不足以考虑使用面向文档的数据库。还有很多事情要考虑,REST <> CRUD只是其中的一小部分。
igorsantos12年

1
我赞成这一点,因为在我看来是倾斜地引用了所谓的“对象关系阻抗不匹配”(请参阅blogs.tedneward.com/post/the-vietnam-of-computer-science)。
汤姆·罗素
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.