我可以在MongoDB中的嵌入式文档中创建多对多关系吗?

时间:2012-03-03 03:09:07

标签: mongodb many-to-many modeling

给出以下类图: Class Diagram

我应该如何处理哪些应该是集合以及应该嵌入哪些集合?由于Play / Scene和Play / Character之间存在1..N关系,我通常会在Play中嵌入这些文档。但用例是我还需要跟踪哪个角色出现在哪个场景中。这是否会说现在场景和角色需要成为他们自己的收藏品还是有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

许多戏剧都有很多角色和场景,而且这些角色在很多戏剧中都有许多外观,这是我对该架构的直接思考。

但是要回答你的问题。在嵌入式上做很多很多事情并不是一个明智的想法,很可能实际上是一个糟糕的(甚至是可怕的)想法。

我会将常用的​​实体拆分为单独的表格。

答案 1 :(得分:0)

我认为对标题问题的简短回答是否定的。您不能拥有嵌入多个位置的文档。这就像试图同时在两个壳内有一个鸡蛋。在我的脑海中,我认为mongodb关系是洋葱(layers = embeds),其中的线程连接到其他洋葱(thread = reference)。这可能是一个棘手的类比,但它适用于我。

让我们说角色 - 即使是那些同名的角色 - 对于他们所处的游戏来说是独一无二的。所以那些将被嵌入。

场景看起来像嵌入式阵列的一个明显例子。你永远不会有一个出现在多个剧中的场景。

外观应嵌入场景中,原因与播放场景中的场景相同。外观也会引用这个角色。是否有外观没有引用角色?我想不是,但不确定。

所以我会这样做(伪建模):

Play { 
  embeds-many Characters 
  embeds-many Scenes }  

Scene { embeds-many Appearances }

Appearance { references a Character } 

Character { }

我认为从外观中引用角色绝对是可能的,你只需要在外观中存储角色的ID。接下来的问题是你正在使用什么语言...如果你在Rails,我个人喜欢Mongoid。