我有两个对象:
- 香蕉
- 吊篮
香蕉可以在没有篮子的情况下生存
但是篮子里必须装一根香蕉。
我做到了:
香蕉类嵌入
班级吊篮嵌入Banana
但是
当我尝试制作香蕉时,mongoid抱怨没有篮子。
解决方案是什么?
香蕉可以在没有篮子的情况下存在
这使它成为一级公民,因此嵌入并不是一个真正的选择(可以为不在篮子里的香蕉创建"影子篮子",但这个想法在凌晨1点太令人毛骨悚然了。不推荐)。
听起来一个篮子里可能有不止一根香蕉,但即使没有,扭转聚合似乎也没有意义(即将篮子"放"在香蕉中)。它没有模拟现实,所以它可能是一个糟糕的设计。
篮子里必须装一根香蕉。
您必须在客户端代码中确保这一点,并将香蕉和篮子作为一级公民:
basket { _id : 7871, ... }
banana { _id : 4545, basket_id : 7871, ... }
或
basket { _id : 7871, banana_ids : [ 4545, ... ] }
banana { _id : 4545, ... }
第二种变体使一个篮子必须有一根香蕉的规则更容易执行,而第一种变体使确保一根香蕉不同时在两个篮子中更容易。
确保满足这些标准并不是一件小事,因为mongodb不支持事务,并且不能原子地修改多个文档。您的客户端代码将不得不处理此问题,例如通过锁定。