什么是表示具有属性的多对多关系的最"mongo"方式?
例如:
介绍MYSQL表
people
=> firstName, lastName, ...
Movies
=> name, length ..
peopleMovies
=> movieId, personId, language, role
将人们嵌入电影......?
在MongoDB中我理解它很好,denormalize and embed
但我不想让embed
人们看电影,它在逻辑上没有任何意义.因为人们不一定只属于电影.
People
并且Movies
将两个单独的集合.
People
=>嵌入[{movieId: 12, personId: 1, language: "English", role: "Main"} ...]
Movies
=>嵌入 [{movieId: 12, personId: 1, language: "English", role: "Main"} ...]
此解决方案的问题在于,当我们想要更新role
特定人员时,movie
我们需要运行两个更新查询以确保两个集合中的数据同步.
我们也可以做更多关系的事情,并最终得到三个集合
People
=> firstName, lastName, ...
Movies
=> name, length ..
Castings
=>movieId, personId, language, role
这个问题是因为MongoDB中缺少连接语句,所以需要3 queries
从人 - >电影,反之亦然.
这是我的问题,有什么其他方法可以MongoDB
用更多NoSQL
方式对这样的东西进行建模.就所提供的解决方案而言,哪一个在mongo中的性能和惯例方面是最好的.
在许多方面,meteor的API鼓励平面关系文档,但MongoDB是一个非关系数据存储.不幸的是,这种冲突留给了开发人员解决的练习.
模式结构和连接的概念是一个在单个答案中涵盖的巨大主题,因此我将尝试尽可能简洁.
假设您有评论和发布数据.考虑如果您在帖子中嵌入评论会发生什么.
DDP对文档进行操作.每次添加同一帖子中的新评论时,都会发送所有评论.
allow
和deny
规则对文件进行操作.期望相同的规则同时适用于帖子和评论可能是不合理的.
出版物往往在收藏方面更有意义.在上面的场景中,我们无法轻松发布独立于其帖子的评论列表.
关系数据库存在的原因很充分.其中之一是避免第二个解决方案中固有的多重修改问题.
MongoDB本身不支持连接,并且没有用于生成响应连接的核心包.
使用第三种解决方案.根据我的经验,选择关系模型的原因远远超过数据存储所施加的限制.当然,克服缺少连接并不容易,但痛苦很可能只与少数发布功能隔离开来.以下是我强烈推荐的一些资源:
如何在EventedMind上发布多对多关系.Chris详细介绍了您的确切用例,但他手动使用observe回调来进行反应式连接,我不建议这样做.
来自Discover Meteor Encyclopedia的反应性加入流星.这包括了如何以及为什么应该进行反应性连接的基础知识.
来自Discover Meteor的非规范化章节.这涵盖了我上面提到的许多要点,并讨论了何时以及如何对一些数据进行非规范化.
您可以使用发布关系来加入数据.替代软件包包括:智能发布,发布组合和简单发布.
如果您需要更多信息,请在下面评论,我会更新我的答案.