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

Posted

技术标签:

【中文标题】为啥我应该使用基于文档的数据库而不是关系数据库?【英文标题】:Why should I use document based database instead of relational database?为什么我应该使用基于文档的数据库而不是关系数据库? 【发布时间】:2009-01-14 00:21:48 【问题描述】:

为什么我应该使用像 CouchDB 这样的基于文档的数据库,而不是使用关系数据库。 有没有什么典型的应用或领域,文档型数据库比关系型数据库更适合?

【问题讨论】:

也许面向文档的数据库在某些方面可能类似于“实体-属性-值”(EAV) 数据库。 【参考方案1】:

也许你不应该:-)

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

我个人也很喜欢这样一个事实,即我不需要任何 CouchDB 的客户端库,除了 HTTP 客户端,现在几乎所有编程语言都包含它。

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

如需更详细的列表,请查看this posting of Richard Jones。

【讨论】:

两年来我从未见过任何数据库模式类似于我们开始使用的原始模式......所以一切都是平等的(它不是......),你应该总是使用无模式数据库= 面向文档的;我认为这是一个相当具有误导性的名字...... @int3 如果您不能将数据描述为一组列,您应该如何对所述数据编写智能查询?【参考方案2】:

CouchDB(来自他们的website)

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

具有平坦地址空间的 Ad-hoc 和无模式。关系数据库具有复杂、固定的模式。你定义表、列、索引、序列、视图和其他东西。 Couch 不需要这种复杂、昂贵、脆弱的高级计划。

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

可查询和可索引,具有使用 javascript 作为查询语言的面向表格的报告引擎。 SQL 和关系数据库也是如此。这里没有什么新鲜事。

所以。为什么选择 CouchDB?

REST 比 JDBC 或 ODBC 更简单。 没有比架构更简单的架构了。 以一种看似简单且廉价的方式分发。

【讨论】:

虽然我是 NoSQL 数据库的忠实粉丝,但第一个说法(REST 比 JDBC 更简单)非常可疑。 REST 协议对我来说似乎很简单,因为它只是 HTTP:无状态、少数方法等,等等。也许 JDBC(在底层)很简单;它似乎并不简单,仅基于有状态。 @S.Lott 答案不应该更“通用”而不是只针对 CouchDb 吗? “脆弱的高级计划”与什么?以我的经验,另一种选择是无计划,这会导致一时兴起修改意大利面条数据结构。【参考方案3】:

用于愚蠢地存储和提供其他服务器数据。

在过去的几周里,我一直在玩一个 lifestream 应用程序,它可以轮询我的提要(delicious、flickr、github、twitter...)并将它们存储在 couchdb 中。 couchdb 的美妙之处在于它让我可以将原始数据保持在其原始结构中,而不会产生任何开销。我为每个文档添加了一个“类”字段,存储源服务器,并为每个源编写了一个 javascript 渲染类。

概括而言,每当您的服务器与另一台服务器通信时,最好使用无架构存储,因为您无法控制架构。作为奖励,couchdb 使用服务器和客户端的本机协议 - JSON 用于表示,HTTP REST 用于传输。

【讨论】:

为什么不将它们存储在一个文件中,或者每个提要一个文件中? 因为 couchdb 还允许您使用 map/reduce 创建有趣的视图。例如,我可以根据数据源创建一个视图,或者我可以计算每个源的总计。 这是一个绝妙的点......如果您正在使用数据并且无法控制入站数据架构 - 使用文档存储。 这是我听到的关于 NoSQL 数据库价值的第一个真正令人信服的论点【参考方案4】:

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

当我不断地改进我的架构时,我经常因为必须在 mysql/SQLite 中维护架构而感到沮丧。虽然我还没有对 CouchDB 做太多事情,但我确实喜欢在 RAD 过程中演化模式是多么简单。

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

【讨论】:

好点。文档(和其他无模式)数据存储非常适合早期的快速开发。然而,出于同样的原因,它们非常适合早期原型设计,但它们对于稳健的生产应用程序来说是有问题的。【参考方案5】:

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

【讨论】:

【参考方案6】:

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

我在以 JSON 格式存储数据的文档数据库中最大的赢家是:这是 JavaScript 的原生格式。因此,JavaScript Web 应用程序与 CouchDB 配合得非常好。我最近制作了一个使用 CouchDB 的 Web 应用程序,它速度很快,同时还能够处理不断变化的数据结构。

【讨论】:

【参考方案7】:

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

此外,如果您的数据不是关系数据且不能存储在表格中而是一组图像或例如报纸文章,则您应该使用文档数据库。

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

【讨论】:

以上是关于为啥我应该使用基于文档的数据库而不是关系数据库?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在数据库而不是文件系统中插入 blob?

为啥使用 argparse 而不是 optparse?

为啥我应该使用 JWT 而不是简单的散列令牌

为啥我们应该使用 RNN 而不是马尔可夫模型?

我啥时候应该使用 mongoDB 而不是关系数据库

核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?