Ruby on rails 用MongoDB设计一个可同步的嵌入式集合

Ruby on rails 用MongoDB设计一个可同步的嵌入式集合,ruby-on-rails,mongodb,mongoid,nosql,Ruby On Rails,Mongodb,Mongoid,Nosql,我想举一个我正在苦苦挣扎的设计决策的例子: 假设我有一个“待办事项列表”应用程序,每个列表定义为一个MongoDB文档,其项定义为一个嵌入式集合 这非常简单,但现在我想添加一种“fork”功能,这样我的朋友就可以复制我的文档,并在我对原始文档进行更改时自动同步这些项目 也就是说,当我在我的列表中添加、重命名、删除或重新排序项目时,我将能够更新它们的列表,同时仍然保持它们的项目处于选中/未选中状态 以下是一些想法,但我对MongoDB还不熟悉,只是不知道每个想法的实现难度有多大,这更可取,也看不到

我想举一个我正在苦苦挣扎的设计决策的例子:

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

这非常简单,但现在我想添加一种“fork”功能,这样我的朋友就可以复制我的文档,并在我对原始文档进行更改时自动同步这些项目

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

以下是一些想法,但我对MongoDB还不熟悉,只是不知道每个想法的实现难度有多大,这更可取,也看不到可能出现的所有问题:

  • RDBMS方法:将项目作为一个单独的集合,每个项目都由嵌入列表中的“选中/未选中”项目引用(本质上是一个多对多关系)
  • 引用原始项目:每个嵌入的复制项目都将引用原始文档中的对应项目,这样我就可以知道原始项目是被重命名、删除还是新添加的
有人能提供一些有助于决定解决方案的见解吗

更新:

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


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

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

{
“_id”:123,
“名称”:“喂猫”
}

您可以制作如下的待办事项列表文档:

{
“_id”:1,
“项目”:[123,…]
}

我建议这样做的原因是,保持经常更改的嵌入式文档同步。。。这很难。如果一个嵌入的文档将到处出现,那么拥有一个权威版本的文档,然后链接到该文档的id就容易多了


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

这确实有帮助,但让我重新考虑我的问题。我真的很想让副本保持不变,直到它们的所有者主动决定将它们与原件同步。在这种情况下,第一种方法不太合适。
{
   "_id" : 123,
   "Name" : "Feed the cat"
}
{
   "_id" : 1,
   "items" : [ 123, ... ]
}