对于允许检索关系数据的文档存储数据库,有哪些选择?举一个真实的例子,假设你有一个数据库来存储博客文章。我想让数据看起来像:{id: 12345,
title: "My post",
body: "The body of my post",
author: {
id: 123,
name: "Joe Bloggs",
email: "joe.bloggs@example.com"
}
}
现在,您可能会有许多这样的记录,它们都共享作者的详细信息。我真正想要的是将作者本身作为不同的记录存储在数据库中,这样,如果您更新这一条记录,那么链接到它的每个post记录也会得到更新。到目前为止,我看到的唯一的方法是让post记录存储author记录的id,这样调用代码将不得不对数据存储进行两次查询,一次是对post的查询,另一次是对链接到post的author id的查询。
是否有文档存储数据库允许我进行单个查询并返回包含链接记录的结构化文档?最好允许我编辑文档的内部部分,将文档作为一个整体持久化,并使正确的事情发生[即在上面,如果我检索了整个文档,更改了电子邮件的值并持久化了整个文档,那么作者记录的电子邮件地址将被更改,并反映在所有有作者的帖子中…]
最佳答案
首先,让我承认:这种特殊类型的数据本质上是有点关系的。这完全取决于您想要如何构造这种类型的数据,以及对于这个特定的项目您可以轻松访问哪些技术。也就是说,你希望你的数据结构如何?
如果您可以按任何方式构造数据,可以执行以下操作:
{
name: 'Joe',
email: 'joe.bloggs@ex.com',
posts: [
{
id: 123,
title: "My post"
},
{..}
]
}
所有的帖子都包含在一个特定的键/值对中。我认为这种特殊类型的数据非常适合Riak(因为它能够在内部使用javascript查询json)。尽管您可能可以从任何nosql数据存储视图(Cassandra,Couch,Mongo,等等)中找到它,因为它们大多数都可以直接存储json。由于我个人的经验,我在这一点上倾向于RIAK。
您可能遇到的更有趣的事情将与您如何处理数据存储有关。例如,我真的很喜欢使用Ripple for Ruby,这让我在Riak中处理此类数据变得非常容易。但如果你在Java领域,这可能会使采用这种技术变得有点困难(尽管我没有花太多时间研究Java采用RIAK),因为它往往落后于“边缘”式的数据存储技术。
更重要的是,让你的大脑开始用nosql术语思考,或者不使用“关系”通常是构建数据所需时间最长的。因为没有模式,也没有任何先入之见,这意味着您可以做很多在关系数据库世界中被认为是错误的事情。就像将一个用户的所有博客文章存储在一个文档中一样,这在标准模式的强表关系世界中是行不通的。