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

 mobiledu2502890883 发布于 2022-12-27 15:22

什么是表示具有属性的多对多关系的最"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中的性能和惯例方面是最好的.

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

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

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

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

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

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

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

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

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

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

    建议

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

    如何在EventedMind上发布多对多关系.Chris详细介绍了您的确切用例,但他手动使用observe回调来进行反应式连接,我不建议这样做.

    来自Discover Meteor Encyclopedia的反应性加入流星.这包括了如何以及为什么应该进行反应性连接的基础知识.

    来自Discover Meteor的非规范化章节.这涵盖了我上面提到的许多要点,并讨论了何时以及如何对一些数据进行非规范化.

    您可以使用发布关系来加入数据.替代软件包包括:智能发布,发布组合和简单发布.

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

    2022-12-27 15:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有