【发布时间】:2014-10-10 06:04:32
【问题描述】:
表示具有属性的多对多关系的最“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"} ...]
这个解决方案的问题是,当我们想要为特定的movie 更新某人的role 时,我们需要运行两个更新查询以确保两个集合中的数据同步。
解决方案 3
我们还可以做一些更相关的事情,最终得到三个集合
People => firstName, lastName, ...
Movies => name, length ..
Castings => movieId, personId, language, role
问题在于,由于 MongoDB 中缺少 join 语句,因此需要 3 queries 才能从人 -> 电影,反之亦然。
这是我的问题,还有哪些其他方法可以以MongoDB 和更多NoSQL 的方式对此类事物进行建模。就提供的解决方案而言,在 mongo 中哪一个在性能和约定方面是最好的。
【问题讨论】:
-
虽然那篇文章有一些不错的地方,但我觉得它完全遗漏了很多东西。就像将 cast_members 嵌入到 tv_shows 中一样。如果您想查找特定演员的 tv_shows 怎么办?
-
MongoDB 不是为存储关系数据而设计的。 Meteor 的许多 API(模板迭代、DDP、允许/拒绝、发布)不鼓励使用嵌入式文档。根据我的经验,与 Meteor 战斗比与 Mongo 战斗要困难得多。我的一般建议是咬紧牙关并以相关方式存储文档(解决方案 3)。 Discover Meteor 的“反规范化”一章也涵盖了这个主题。
-
@DavidWeldon 无法检查资源,因为我需要购买它。我想问你是否有一些关于如何使用流星中的关系模型设置查询的资源(使用 pub/sub 方法)
标签: javascript mysql mongodb meteor nosql