使用MongoDB中的属性表示多对多关系的最佳模型

Maa*_*aaz 19 javascript mysql mongodb nosql meteor

什么是表示具有属性的多对多关系的最"mongo"方式?

例如:

介绍


MYSQL表

people => firstName, lastName, ...

Movies => name, length ..

peopleMovies => movieId, personId, language, role

解决方案1


将人们嵌入电影......?

在MongoDB中我理解它很好,denormalize and embed但我不想让embed人们看电影,它在逻辑上没有任何意义.因为人们不一定只属于电影.

解决方案2


People并且Movies将两个单独的集合. People=>嵌入[{movieId: 12, personId: 1, language: "English", role: "Main"} ...]

Movies =>嵌入 [{movieId: 12, personId: 1, language: "English", role: "Main"} ...]

此解决方案的问题在于,当我们想要更新role特定人员时,movie我们需要运行两个更新查询以确保两个集合中的数据同步.

解决方案3


我们也可以做更多关系的事情,并最终得到三个集合

People=> firstName, lastName, ... Movies=> name, length .. Castings=>movieId, personId, language, role

这个问题是因为MongoDB中缺少连接语句,所以需要3 queries从人 - >电影,反之亦然.

这是我的问题,有什么其他方法可以MongoDB用更多NoSQL方式对这样的东西进行建模.就所提供的解决方案而言,哪一个在mongo中的性能和惯例方面是最好的.

Dav*_*don 14

在许多方面,meteor的API鼓励平面关系文档,但MongoDB是一个非关系数据存储.不幸的是,这种冲突留给了开发人员解决的练习.

模式结构和连接的概念是一个在单个答案中涵盖的巨大主题,因此我将尝试尽可能简洁.

您应该选择关系模型的原因

假设您有评论和发布数据.考虑如果您在帖子中嵌入评论会发生什么.

  • DDP对文档进行操作.每次添加同一帖子中的新评论时,都会发送所有评论.

  • allowdeny规则对文件进行操作.期望相同的规则同时适用于帖子和评论可能是不合理的.

  • 出版物往往在收藏方面更有意义.在上面的场景中,我们无法轻松发布独立于其帖子的评论列表.

  • 关系数据库存在的原因很充分.其中之一是避免第二个解决方案中固有的多重修改问题.

您应该选择嵌入式模型的原因

  • MongoDB本身不支持连接,并且没有用于生成响应连接的核心包.

建议

使用第三种解决方案.根据我的经验,选择关系模型的原因远远超过数据存储所施加的限制.当然,克服缺少连接并不容易,但痛苦很可能只与少数发布功能隔离开来.以下是我强烈推荐的一些资源:

如果您需要更多信息,请在下面评论,我会更新我的答案.

  • 同意.将[模型图层](http://dweldon.silvrback.com/models)添加到您的应用程序可以提供帮助. (2认同)