关系文档存储(NoSql?)数据库引擎有哪些选择?

时间:2011-04-08 21:58:41

标签: database nosql relational

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

现在,您可能会拥有许多共享作者详细信息的记录。我真正喜欢的是让作者本身作为不同的记录存储在数据库中,这样如果你更新这一条记录,那么链接到它的每个帖子记录也会获得更新。到目前为止,我所见过的唯一方法就是让帖子记录存储一个作者记录的ID,这样调用代码就必须对数据存储进行两次查询 - 一个用于帖子,另一个用于帖子对于链接到帖子的作者ID。

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

1 个答案:

答案 0 :(得分:2)

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

如果您可以按照自己想要的方式构建数据,可以使用以下内容:

{
  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术语思考,或者不使用'关系',这通常需要花费最长的时间来构建数据。因为没有架构,并且没有任何先入为主的概念,这意味着您可以在关系数据库世界中做很多被认为是错误的事情。就像将一个用户的所有博客文章存储在一个文档中一样,这在基于标准模式的基于强大表的关系世界中是行不通的。