首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不同馆藏文档间的关系

不同馆藏文档间的关系
EN

Stack Overflow用户
提问于 2015-05-26 13:18:15
回答 5查看 4.8K关注 0票数 10

我还没有准备好让这件事过去,这就是为什么我重新思考这个问题,并编辑了Q(原文如下)。

我在周末项目中使用mongoDB,它需要DB中的一些关系,这就是痛苦的所在:

我有三个收藏品:

代码语言:javascript
运行
复制
Users
Lists
Texts

用户可以有文本和列表-列表‘包含’文本。文本可以出现在多个列表中。

我决定使用单独的集合(而不是嵌入),因为子文档并不总是出现在父文档的上下文中(例如。所有的文本,没有列在一个列表中)。

所以,我们需要做的就是把属于特定列表中的文本与这些列表联系起来。可以有无限的列表和文本,尽管列表会比较少。

与我最初想的不同,我也可以将引用放在每个文本文档中,而不是列表文档中的所有文本In中。这实际上会产生不同的效果,因为我可以用一个查询来查找列表中的每个片段。甚至可以索引那个引用。

代码语言:javascript
运行
复制
var TextSchema = new Schema({
      _id: Number,
      name: String,
      inListID: { type : Array , "default" : [] },
      [...]

文本也很少出现在许多列表中,因此数组不会真的爆炸。然而,问题仍然存在,这种扩展的可能性,或者实际上是用mongoDB实现它的更好的方法?限制文本列表的数量(可能)有帮助吗?有没有几个人的秘诀:许多关系?

如果能得到这样做的项目以及它是如何实施的(很少:许多关系),那就太棒了。我不敢相信,一旦需要一些关系,每个人都会回避mongo。

原始问题

我将把它分解为两个问题:( 1)让我们假设一个列表由5条文本组成。我如何引用清单中的文本?打开一个数组并将文本的_ids存储在那里?似乎这些阵列可能会长到月球和回来,减慢应用程序?另一方面,文本需要在没有列表的情况下使用,因此嵌入并不是一种选择。如果我想要一个包含100条文字的列表的所有文本..。听起来像是两个查询和一个包含100个字段的数组:-/。那么,这种引用方式是否是正确的方法呢?

代码语言:javascript
运行
复制
var ListSchema = new Schema({
  _id: Number,
  name: String,
  textids: { type : Array , "default" : [] },
  [...]

问题2)我发现这种方法是在删除文本时清除引用。它的引用仍然存在于每个包含文本的列表中,我不想遍历所有的列表来清除那些死引用。或者我会?有什么聪明的办法解决这个问题吗?仅仅是让文本保留引用(在哪些列表中)只会转移问题,所以这不是一种选择。

我想我不是第一个遇到这种问题的人,但我也没能找到关于如何“正确”的明确答案。

我还对这种引用的最佳实践(多对多?)的一般想法感兴趣。尤其是可伸缩性/性能。

EN

Stack Overflow用户

发布于 2015-06-04 08:26:58

写一个答案,因为我想解释我将如何从这里开始。

考虑到这里的答案和我自己对这个主题的研究,将这些引用(实际上不是关系)存储在数组中可能是很好的,尝试将其保持较小:在我的例子中,很可能少于1000个字段。

特别是因为我可以使用一个甚至不需要使用$in的查询(虽然我第一次做不到),所以我相信这个方法会扩展。毕竟,这只是一个周末的项目,所以如果没有

使用这样的文本模式:

代码语言:javascript
运行
复制
var textSchema = new Schema({
  _id: {type: Number, required: true, index: { unique: true }},
  ...
  inList: { type : [Number] , "default" : [], index: true }
});

我可以使用这个查询获取列表中的所有文本,其中inList是一个索引数组,包含列表中文本的_ids

代码语言:javascript
运行
复制
Text.find({inList: listID}, function(err, text) {
  ...      
});

我仍然需要处理外键约束,并编写自己的“清理”函数,负责删除列表中的引用--删除列表中所有文本中的引用。幸运的是,这种情况很少发生,所以我可以偶尔阅读每一条短信。

另一方面,如果删除文本,我不必关心删除列表文档中的引用,因为我只将引用存储在关系的一侧(文本-文档中)。在我看来,这是很重要的一点!

@mnemosyn:谢谢你的链接,并指出这确实不是一个很大的连接,换句话说,就是一个非常简单的关系。还有一些关于这些复杂操作需要多长时间的数字(ofc )。硬件部门)是一个很大的帮助。

PS: Grüe aus Bielefeld.

在我自己的研究这是维德中,我发现最有帮助的是阿尔文·理查兹( Alvin ),在那里,阿尔文·理查兹(Alvin)在“分钟”( min )时也谈到了多到多的关系。17.这就是我想让这种关系一边倒的想法,以便为自己节省一些清理死掉的参考文献的工作。

谢谢你们的帮助

票数 0
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30459764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档