对于一个EVENTUALLY属于某个东西的无父对象,什么是正确的mongoid关系?

时间:2014-02-15 00:52:06

标签: ruby-on-rails mongodb mongoid

我有两个对象:

  1. 香蕉
  2. 没有篮子的香蕉可以存在

    但是一个篮子必须包含香蕉。

    我做了:

    香蕉班   embedded_in

    班级篮子   嵌入香蕉

    BUT

    当我尝试制作一个香蕉时,mongoid抱怨没有一个篮子。

    解决方案是什么?

1 个答案:

答案 0 :(得分:0)

  

没有篮子的香蕉可以存在

这使得它成为一级公民,所以嵌入不是一个真正的选择(人们可以为不在篮子里的香蕉制作'影子篮',但这个想法在凌晨1点过于令人毛骨悚然。不推荐)。

听起来篮子里可能有不止一个香蕉,但即使没有,转动聚集似乎也没有意义(即把篮子放在'香蕉'中)。它不会模拟现实,所以它可能是一个糟糕的设计。

  篮子必须包含香蕉。

您必须在客户代码中确保这一点,并将香蕉和篮子作为一级公民:

basket { _id : 7871, ... }
banana { _id : 4545, basket_id : 7871, ... }

basket { _id : 7871, banana_ids : [ 4545, ... ] }
banana { _id : 4545, ... }

第二种变体可以更容易地执行篮子必须有香蕉的规则,而第一种变体可以更容易确保一个香蕉同时不在两个篮子中。

确保满足这些条件并非易事,因为mongodb不支持事务,并且您不能自动修改多个文档。您的客户端代码必须处理此问题,例如通过锁定。