在工作中,我们最近启动了一个使用 CouchDB(面向文档的数据库)的项目。我一直很难忘记我所有的关系数据库知识。

我想知道你们中的一些人是如何克服这个障碍的?你是如何停止关系性思考并开始记录性思考的(我很抱歉编造了这个词)。

有什么建议么?有帮助的提示?

编辑:如果有什么不同的话,我们将使用 Ruby 和 CouchPotato 连接到数据库。

编辑2:SO 一直在骚扰我接受答案。我认为我选择了对我学习帮助最大的一个。然而,我认为没有真正的“正确”答案。

有帮助吗?

解决方案

我认为,在仔细阅读了有关该主题的几页内容之后,这完全取决于您正在处理的数据类型。

RDBMS 代表一种自上而下的方法,数据库设计者可以断言数据库中存在的所有数据的结构。您定义一个人有名字、姓氏、中间名和家庭住址等。您可以使用 RDBMS 强制执行此操作。如果您没有关于某个人的家乡星球的专栏,那么想成为拥有与地球不同的家乡星球的人的人就很不幸了;您必须稍后添加一列,否则数据无法存储在 RDBMS 中。无论如何,大多数程序员都会在他们的应用程序中做出这样的假设,因此假设和执行这并不是一件愚蠢的事情。定义事物可能是件好事。但如果您将来需要记录其他属性,则必须添加它们。关系模型假设您的数据属性不会发生太大变化。

使用 MapReduce 之类的“云”类型数据库,在您的例子中是 CouchDB,不要做出上述假设,而是从下往上查看数据。数据输入到文档中,文档可以具有任意数量的不同属性。它假设您的数据,根据其定义,其可能具有的属性类型是多种多样的。它说:“我只知道我在数据库人员中有这个文档,该文档具有“ eternium”的本地属性和“ nibbler勋爵”的名称,但没有姓氏。”该模型适合网页:所有网页都是一个文档,但文档的实际内容/标签/键差异很大,以至于您无法将它们放入 DBMS 自上而下的严格结构中。这就是为什么 Google 认为 MapReduce 模型是 roxors soxors,因为 Google 的数据集非常多样化,需要从一开始就构建模糊性,并且由于海量数据集能够利用并行处理(MapReduce 使这变得微不足道) 。文档数据库模型假设您的数据属性可能/将会发生很大变化或非常多样化,如果数据存储在关系数据库中,则可能会发现“间隙”和大量稀疏填充的列。虽然您可以使用 RDBMS 来存储这样的数据,但它很快就会变得丑陋。

那么回答你的问题:在查看使用 MapReduce 范例的数据库时,您根本无法进行“关系”思考。因为,它实际上并不存在强制关系。这是一个你必须克服的概念性难题。


我遇到的一篇很好的文章对这两个数据库进行了很好的比较和对比 映射减少:重大后退, ,它认为 MapReduce 范式数据库是技术倒退,并且不如 RDBMS。我不同意作者的论点,并认为数据库设计者只需根据他/她的情况选择正确的数据库即可。

其他提示

它的所有有关的数据。如果你有数据,这使得最有意义的关系,文件的储存可能不会有用的。一个典型的文档系统是一个搜索服务器,你有一个巨大的数据集,并希望找到一个具体项目/文件,该文件是静态的,或版本。

在一个档案类型的情况,该文件可从字面上的文件,不改变和具有非常灵活的结构。它没有意义的商店他们的元数据在一个关系数据库,因为他们都是非常不同的,所以很少的文件可以分享这些标记。文件基础的系统不存储空值。

非关系/文件的数据有意义的当规范化.它不会改变很多,或者你不在乎更多一致性。

如果您使用的情况下适合的关系模式那么它可能是不值得挤入一文件模型。

这里有一个很好的文章 非关系型数据库.

另一种方式思考它是一个文件是一个行。一切有关的文件是在该行,它是具体到该文件。行简单分割,如此扩展更加容易。

在CouchDB中,像Lotus Notes时,你真的不应该去想文档作为类似于一行。

相反,一个文档是一个关系(表)。

每个文档具有行数 - 字段值:

ValueID(PK)  Document ID(FK)   Field Name        Field Value
========================================================
92834756293  MyDocument        First Name        Richard
92834756294  MyDocument        States Lived In   TX
92834756295  MyDocument        States Lived In   KY

每个视图是跨越一个巨大的UNION ALL的每一个文档的。选择一个交叉表查询

因此,它仍然是关系,但不是最直观的感觉,而不是在最重要的意义:良好的数据管理规范

面向文档的数据库不拒绝关系的概念,他们只是有时让应用程序取消引用链接(CouchDB的),甚至有文档(MongoDB的)之间的关系的直接支持。更为重要的是,DODBs是无模式。在基于表的储存这个属性可以用显著的开销(见richardtallent答案)来实现,但在这里它更有效地完成。我们从一个RDBMS到DODB切换时真的应该学习的是关于表忘了,并开始思考数据。这就是sheepsimulator所谓的“自下而上”的方法。这是一个不断发展的模式,而不是预定强求一致床。当然,这并不意味着大纲应该以任何形式彻底抛弃。应用程序必须解释这些数据,在某种程度上限制了它的形式 - 这可以通过组织文件到集合,通过与验证方法模型来完成 - 但现在这是应用程序的工作。

可能是你应该阅读本 http://books.couchdb.org/relax/getting-started

我自己刚听到它,它是有趣的,但不知道如何实现,在现实世界中的应用;)

一两件事你可以尝试越来越Firefox和萤火虫的副本,并在JavaScript中的地图减少的功能发挥。它们实际上是相当冷静和乐趣,而且似乎是如何在CouchDB中办成事情的基础。

这里的乔尔对这个问题的小文章: HTTP://www.joelonsoftware的.com /项目/ 2006/08 / 01.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top