【问题标题】:Designing a synchronizable embedded collection with MongoDB使用 MongoDB 设计可同步的嵌入式集合
【发布时间】:2013-03-23 02:08:16
【问题描述】:

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

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

这很简单,但现在我想添加一种“分叉”功能,这样我的朋友就可以复制我的文档,并且每当我在原始文档上对它们进行更改时,它们都会自动同步 /em>。

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

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

  • RDBMS 方式: 将项目保存为单独的集合,每个项目都由嵌入在列表中的“选中/未选中”项目引用(本质上是多对多关系)。
  • 引用原始项目:每个嵌入的复制项目都将引用原始文档中的对应项,这样我就可以知道原始项目是否被重命名、删除或新增。

谁能提供任何有助于决定解决方案的见解?

更新:

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

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

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid nosql


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 这确实有帮助,但让我重新考虑我的问题。我真的很想让副本保持不变,直到它们的所有者主动决定将它们与原件同步。在这种情况下,第一种方法不太合适。
    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-11-30
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多