【问题标题】:What choices for a relational Document-store (NoSql?) database engine?关系文档存储(NoSql?)数据库引擎有哪些选择?
【发布时间】:2011-04-09 06:33:14
【问题描述】:

对于允许检索关系数据的文档存储数据库有哪些选择?举一个真实的例子,假设你有一个数据库来存储博客文章。我想让数据看起来像:
{id: 12345,
title: "My post",
body: "The body of my post",
author: {
id: 123,
name: "Joe Bloggs",
email: "joe.bloggs@example.com"
}
}

现在,您可能会拥有许多共享作者详细信息的此类记录。我真正想要的是让作者本身作为不同的记录存储在数据库中,这样如果你更新这条记录,链接到它的每条帖子记录也会得到更新。迄今为止,我看到的唯一方法是让帖子记录存储作者记录的 ID,以便调用代码必须对数据存储进行两次查询 - 一个用于帖子,另一个用于用于链接到帖子的作者 ID。

是否有任何文档存储数据库允许我进行单个查询并返回包含链接记录的结构化文档?最好允许我编辑文档的内部部分,将文档作为一个整体保存下来,并让正确的事情发生 [即在上面,如果我检索了整个文档,更改了电子邮件的值并保留了整个文档,那么作者记录的电子邮件地址将被更改,并反映在所有具有该作者的帖子中...]

【问题讨论】:

    标签: database nosql relational


    【解决方案1】:

    首先,让我承认:这种特殊类型的数据在本质上有些关系。这仅取决于您希望如何构建此类数据,以及您可以轻松访问该特定项目的哪些技术。也就是说,您希望如何构建数据?

    如果您可以按照自己的方式构建数据,则可以采用以下方式:

    {
      name: 'Joe', 
      email: 'joe.bloggs@ex.com', 
      posts: [
        {
          id: 123, 
          title: "My post"
        },
        {..}
      ] 
    } 
    

    所有帖子都包含在一个特定的键/值对中。我想说的这种特殊类型的数据特别适合Riak(因为它能够在内部使用 JavaScript 本地查询 JSON)。尽管您可能会从几乎任何 NoSQL 数据存储的观点(CassandraCouchMongo 等)来了解它,因为它们中的大多数都可以直接存储 JSON。由于我个人的经验,我现在只是倾向于 Riak。

    您可能会遇到的更有趣的事情与您处理数据存储的方式有关。例如,我真的很喜欢使用 Ripple for Ruby,这让我在 Riak 中处理这种数据非常容易。但是如果你在 Java 领域,这可能会使采用这种技术变得更加困难(尽管我没有花很多时间研究 Java 对 Riak 的采用),因为它往往落后于“边缘”风格数据存储技术。

    不仅如此,让您的大脑开始以 NoSQL 术语思考,或者不使用“关系”,通常是构建数据所需时间最长的。因为没有模式,也没有随之而来的任何先入之见,这意味着您可以做很多在关系数据库世界中被认为完全错误的事情。就像将单个用户的所有博客文章存储在一个文档中一样,这在标准的模式繁重的基于强表的关系世界中是行不通的。

    【讨论】:

    • 因此我记得为什么简单的例子并不总是最好的......在我的真实用例中,我有多种不同类型的对象链接在一起,并且想要实现我想要的如上所述,但就像那样。具体来说,图书馆目录。一本书链接到一个作者和一个主题。许多书籍与同一作者和主题相关联,许多作者和主题可能与同一作者相关联。现在,在图书馆自动化世界中,您有一个文档 - Marc21 或 MarcXML - 代表书籍和所有链接数据,但我不想复制这些东西..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2011-02-22
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多