首先我想你会想从列表中删除redis,因为它是一个键值存储而不是文档存储。 Riak也是一家重要价值商店,但您可以成为一个文档商店,并拥有像Ripple这样的图书馆。
简言之,与文档存储应用模型是要弄清楚:
- 你会保存自己的文档中的哪些数据,并有另一份文件涉及到它。如果该文档将被许多其他文档使用,那么在它自己的文档中对其进行建模是有意义的。您还必须考虑查询文档。如果您要经常查询它,将它存储在自己的文档中可能是一个好主意,因为您很难在嵌入式文档上进行查询。
- 例如,假设您有多个Blog实例,则博客和文章应该位于其自己的文档中,尽管文章可能嵌入在Blog文档中。
- 另一个例子是用户和角色。为这些文件制定一个单独的文件是有意义的。在我的情况下,我经常会对用户进行查询,如果将它作为自己的文档分开,会更容易。
你想要在另一个文档中存储(嵌入)哪些数据。如果该文档仅属于一个文档,那么将其存储在另一个文档中可能是一个不错的选择。
{ article : { comments : [{ content: 'yada yada', timestamp: '20/11/2010' }] } }
你想考虑的另一个需要注意的是有多大嵌入文档的大小会因为MongoDB的内部,嵌入文档的最大大小是5MB。
- 什么数据应该是一个普通的数组。即g:
- 标签将有意义地存储为一个数组。
{ article: { tags: ['news','bar'] } }
- 或者,如果你想多个ID,即用户存储与多个角色
{ user: { role_ids: [1,2,3]}}
这是关于与文档存储模型的简要概述。祝你好运。
要更好地理解:如果你想在评论中添加用户,我认为你必须在每个评论中去规范化并添加用户名和用户标识符。通过这种方式,您可以在不查询用户的情况下显示博客评论,但您可以轻松检索由给定用户评论的所有博客帖子。这是正确的吗? – Uberto 2010-11-22 16:02:40
不是。您只能在注释文档中添加用户标识。但这取决于你如何组织数据。我通常会将用户标识和用户电子邮件放入评论中,因为我想生成gravatar。 – 2010-12-02 22:38:08