【发布时间】:2015-08-08 04:46:44
【问题描述】:
我还没有准备好放手,这就是我重新思考问题并编辑 Q 的原因(原文如下)。
我在周末项目中使用 mongoDB,它需要数据库中的一些关系,这就是痛苦的全部原因:
我有三个收藏:
Users
Lists
Texts
用户可以拥有文本和列表 - 列表“包含”文本。文本可以在多个列表中。
我决定使用单独的集合(而不是嵌入),因为子文档并不总是出现在其父文档的上下文中(例如,所有文本,而不是在列表中)。
所以需要做的是使用这些列表引用属于某些列表的文本。可以有无限的列表和文本,但相比之下列表会更少。
与我最初想到的不同,我还可以将引用放在每个文本文档中,而不是列表文档中的所有文本 ID。它实际上会有所作为,因为我可以通过一个查询来查找列表中的每个 sn-p。甚至可以索引该参考。
var TextSchema = new Schema({
_id: Number,
name: String,
inListID: { type : Array , "default" : [] },
[...]
文本出现在 MANY 列表中的情况也很少见,因此数组不会真正爆炸。不过,问题仍然存在,是否有可能使用 mongoDB 进行扩展或实际上是一种更好的实现方式?限制文本可以包含的列表数量(可能)是否有帮助?有少数关系的秘诀吗?
获得对已完成此操作以及如何实施的项目的引用(很少:很多关系)甚至会很棒。我不敢相信一旦需要一些关系,每个人都会回避 mongo DB。
原始问题
我将把它分解为我目前看到的两个问题: 1) 假设一个列表由 5 个文本组成。如何引用列表中包含的文本?只需打开一个数组并将文本的 _ids 存储在其中吗?似乎这些阵列可能会增长到月球并返回,从而减慢应用程序的速度?另一方面,文本需要在没有列表的情况下可用,因此嵌入并不是真正的选择。如果我想获取包含 100 个文本的列表的所有文本怎么办......听起来像两个查询和一个包含 100 个字段的数组:-/。那么这种引用方式是否正确?
var ListSchema = new Schema({
_id: Number,
name: String,
textids: { type : Array , "default" : [] },
[...]
问题 2)我看到这种方法是在删除文本时清理引用。它的引用仍将在包含文本的每个列表中,我不想遍历所有列表以清除那些死引用。或者我会?有没有聪明的方法来解决这个问题?只是让文本包含参考(它们在哪个列表中)只会解决问题,所以这不是一个选项。
我想我不是第一个遇到此类问题的人,但我也无法找到关于如何“正确”解决问题的明确答案。
我还对有关此类引用(多对多?),尤其是可扩展性/性能的最佳实践的一般想法感兴趣。
【问题讨论】:
标签: node.js mongodb express mongoose