使用MongoDB设计可同步的嵌入式集合

时间:2013-03-23 02:08:17

标签: ruby-on-rails mongodb mongoid nosql

我想举一个我正在努力解决的设计决策的例子:

假设我有一个“待办事项列表”应用程序,每个列表定义为MongoDB文档,其项目定义为嵌入式集合。

这非常简单,但现在我想添加一种“分叉”功能,所以我的朋友可以复制我的文档,并且只要我在我的原始文档上对它们进行更改,就会自动同步这些项目< / em>的

也就是说,当我在 my 列表中添加,重命名,删除或重新排序项目时,我将能够更新其列表,同时仍然保持他们的项目已选中/未选中状态。

以下是一些想法,但我是MongoDB的新手,并且无法分辨每个实现的难度,这是可取的,并且看不到可能出现的所有问题:

  • RDBMS方式:将项目保存为单独的集合,每个集合都由嵌入在列表中的“已检查/未选中”项目引用(基本上是多对多关系)。
  • 参考原始项目:每个嵌入的复制项目都会引用原始文档中的对应项目,这样我就可以判断原文是否已重命名,删除或新添加。

任何人都可以提供任何有助于确定解决方案的见解吗?

更新

作为用户体验的一部分,我想让复制文档的所有者决定是否更新他的列表,所以我认为第一个实现不会对此有用。

但是如何用第二种方法跟踪变化呢?

1 个答案:

答案 0 :(得分:1)

我强烈建议您采用第一种方法。例如,如果这是一个项目:

{
   "_id" : 123,
   "Name" : "Feed the cat"
}

你会制作一个这样的待办事项列表文件:

{
   "_id" : 1,
   "items" : [ 123, ... ]
}

我建议这样做的原因是因为保持嵌入式文档经常同步更改...非常困难。如果嵌入式文档将全部出现,那么拥有该文档的一个权威版本然后只链接到该文档的ID就容易得多。

这应该允许复制的待办事项列表与原始项目列表不同。它们只是对另一个集合的引用。您可以添加/删除/编辑您想要的所有内容。