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

例如:

Intro


MYSQL表

people => firstName, lastName, ...

Movies => name, length ..

peopleMovies => movieId, personId, language, role

Solution 1


把人植入电影中...?

在MongoDB中,我知道denormalize and embed人很好,但我不想让embed人进入电影,这在逻辑上没有任何意义.因为人们不一定只属于电影.

Solution 2


People and Movies will be two separate collections. People => embed [{movieId: 12, personId: 1, language: "English", role: "Main"} ...]

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

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

Solution 3


我们还可以做一些关系更密切的事情,比如最终得到三个集合

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

The issue with this is that because of the lack of a join statement in MongoDB, it would take 3 queries to go from people -> movies and vice versa.

这里是我的问题,还有什么其他方法可以在MongoDB和更NoSQL的方式中模拟类似的东西.就所提供的解决方案而言,在mongo,哪种解决方案在性能和惯例方面最好.

推荐答案

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

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

Select 关系模型的原因

假设你有 comments 和帖子数据.考虑一下在你的文章中嵌入 comments 会发生什么.

  • DDP对文件进行操作.每次在同一帖子中添加新 comments 时,都会发送所有 comments .

  • allowdeny规则适用于文件.期望同样的规则同时适用于帖子和 comments 可能是不合理的.

  • 出版物往往在Collection 方面更有意义.在上述场景中,我们无法轻松发布独立于他们帖子的 comments 列表.

  • 关系数据库的存在有很好的理由.其中之一是避免第二个解决方案中固有的多次修改问题.

Select 嵌入式模型的原因

  • MongoDB本机不支持连接,也没有生成react 连接的核心包.

建议

使用第三种解决方案.根据我的经验, Select 关系模型的原因远远超过了数据存储施加的限制.当然,克服连接的缺乏并不容易,但痛苦可能只限于少数几个发布函数.以下是我极力推荐的一些资源:

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

Mongodb相关问答推荐

$mod只支持数字类型,不支持MongoDb中的array和int

MongoDB:删除键上有条件的对象元素

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

如何在 kubernetes 中获取分片 mongodb 的备份

如何替换mongodb中的动态键?

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

类型错误:db.close is not a function

使用 Node.js 通过 SSL 连接到 MongoDB

MongoError:$subtract 累加​​器是一元运算符

Java MongoDB/BSON 类混淆

Docker 内部的 Mongo 身份验证

mongo php副本连接非常慢

Golang + MongoDB 嵌入类型(将一个 struct 嵌入到另一个 struct 中)

mongoose得到`TypeError: user.save is not a function` - 出了什么问题

如果我在 MongoDB 上使用 LINQ,为什么会失go 性能?

mongo - Ruby连接问题

Meteor订阅不更新集合的排序顺序

MongoDB 和 Robomongo: Can't connect (authentication)

MongoDb - 利用多 CPU 服务器进行写入繁重的应用程序

mongoose查询返回 null