2010-11-17 18 views
5

我有点尴尬地承认它,但是我在概念化方面遇到了困难,关系世界。特别是考虑到大多数文档/ KV商店具有稍微不同的特征。你会如何构建一个使用文档存储的博客(如CouchDB,Redis,MongoDB,Riak等)

我想从一个具体的例子中学习,但我一直无法找到任何人讨论如何设计架构,例如使用CouchDB/Redis/MongoDB/Riak /等的博客。

有一些问题,我认为是很重要的:

  1. 哪些数据的位应该去归一化(例如,标签可能住在一起的文件,但对于用户)
  2. 你怎么链接文件之间?
  3. 什么是创造总的看法,特别是那些需要排序(如博客索引)

回答

3

首先我想你会想从列表中删除redis,因为它是一个键值存储而不是文档存储。 Riak也是一家重要价值商店,但您可以成为一个文档商店,并拥有像Ripple这样的图书馆。

简言之,与文档存储应用模型是要弄清楚:

  1. 你会保存自己的文档中的哪些数据,并有另一份文件涉及到它。如果该文档将被许多其他文档使用,那么在它自己的文档中对其进行建模是有意义的。您还必须考虑查询文档。如果您要经常查询它,将它存储在自己的文档中可能是一个好主意,因为您很难在嵌入式文档上进行查询。
    • 例如,假设您有多个Blog实例,则博客和文章应该位于其自己的文档中,尽管文章可能嵌入在Blog文档中。
    • 另一个例子是用户和角色。为这些文件制定一个单独的文件是有意义的。在我的情况下,我经常会对用户进行查询,如果将它作为自己的文档分开,会更容易。
  2. 你想要在另一个文档中存储(嵌入)哪些数据。如果该文档仅属于一个文档,那么将其存储在另一个文档中可能是一个不错的选择。

    • 评论有时会更有意义,被嵌入另一个文档

    { article : { comments : [{ content: 'yada yada', timestamp: '20/11/2010' }] } }

    你想考虑的另一个需要注意的是有多大嵌入文档的大小会因为MongoDB的内部,嵌入文档的最大大小是5MB。

  3. 什么数据应该是一个普通的数组。即g:
    • 标签将有意义地存储为一个数组。 { article: { tags: ['news','bar'] } }
    • 或者,如果你想多个ID,即用户存储与多个角色{ user: { role_ids: [1,2,3]}}

这是关于与文档存储模型的简要概述。祝你好运。

+0

要更好地理解:如果你想在评论中添加用户,我认为你必须在每个评论中去规范化并添加用户名和用户标识符。通过这种方式,您可以在不查询用户的情况下显示博客评论,但您可以轻松检索由给定用户评论的所有博客帖子。这是正确的吗? – Uberto 2010-11-22 16:02:40

+0

不是。您只能在注释文档中添加用户标识。但这取决于你如何组织数据。我通常会将用户标识和用户电子邮件放入评论中,因为我想生成gravatar。 – 2010-12-02 22:38:08

1
  1. 决定哪些对象应该是独立的,哪些应该被嵌入其他对象的部分主要是平衡的读/写性能/努力的事情 - 如果一个孩子的对象是独立的,更新就意味着要改变只有一个文件但是在阅读父对象时,您只有ID并需要额外的查询才能获取数据。如果嵌入子对象,则当您读取父文档时,所有数据都在那里,但进行更改需要查找使用该对象的所有文档。

  2. 文档之间的链接与SQL没有多大区别 - 您存储用于查找相应记录的ID。关键区别在于,不是通过筛选子表来通过父ID来查找记录,而是在父文档中具有子ID的列表。对于许多关系,你会在两边都有一个ID列表,而不是中间的一张桌子。

  3. 不同平台之间的查询功能差异很大,因此如何解决这个问题还没有明确的答案。然而,作为一般规则,您通常会在编写文档时设置视图/索引,而不是像存储SQL一样仅仅存储文档和运行临时查询。