我正在将数据库移植到 MongoDB,但遇到了一些文档大小限制的问题。
我的理解是,如果您要始终在另一个实体的上下文中查看一个实体,那么嵌入就是最佳选择。
然而,数据(基因组)每种类型都有如此多的实体,即使只是将 _id 字段存储在嵌入文档中也会使我超过 16 MB 的大小限制:
Genome
{
...
has_reactions:[id1, id2, ... idn] // Where n is really large
}
我也尝试过以其他方式建模,但遇到了相同的限制:
Reaction
{
...
in_genomes:[id1, id2, ... idn] // Still really large
}
MongoDB documentation给出了一对一和一对多关系的很好的例子,但对于多对多关系没有太多可说的。
在传统 SQL 中,我会使用 Genome
、Reaction
和 GenomeReaction
组表对此进行建模。这也是去这里的唯一方法吗?
编辑:
至于背景, react 是一种代谢 react ,尽管基因组和 react 在这种情况下意味着什么并不重要。这也可能是我每个小部件中垫圈类型之间的关系。这是一种标准的多对多关系,其中“多”的两个实例都可以是一个非常大的数字。
我知道 Mongo 不允许联接,但是使用多个查询可以轻松解决这个问题,这是处理 document references in Mongo 的推荐方法。
我们没有选择 Mongo 作为解决方案,我们只是将其作为可能的解决方案进行评估。它看起来很有吸引力,因为它被宣传为能够处理“huMONGOus 数据集”,所以我对这个限制感到有点惊讶。
在我们所有其他用例中,Mongo 都运行良好。正是这种特殊的关系,如果不使用 Genome
、Reaction
和 GenomeReaction
集合集,我就无法从 mysql 移植到 mongo。我可以很容易地做到这一点,但我希望有一种更 mongoy 的方式来处理它。
也许 mongo 不能很好地处理多对多关系,这可以解释它在 data model scenarios 列表中明显缺席的原因。在其文档中。
最佳答案
在官方 mongo-db 邮件列表上询问此问题后,我发现处理此类场景的推荐方法是使用我在原始帖子中提到的三个集合映射,或者使用“hybrid schema design "其中一个集合存储在存储桶中。
所以你会得到类似的东西:
// genomes collection
{
_id: 1,
genome_thingee: 'blah blah'
...
}
// reaction_buckets collection
{
_id: ObjectId(...),
genome_id: 1,
count: 100,
reactions: [
{ reaction-key1: value, reaction-key 2: value},
{ reaction-key1: value, reaction-key 2: value},
{ reaction-key1: value, reaction-key 2: value},
{ reaction-key1: value, reaction-key 2: value},
{ reaction-key1: value, reaction-key 2: value},
...]
}
正如您可能想象的那样,当 adding or querying data 时,您的应用程序必须考虑这种模型的各种影响。 .
虽然最终这种方法对我来说并没有真正的吸引力(因此我决定根据 @Philipp 的建议查看 Neo4j),但我想我应该发布解决方案,以防其他人需要解决类似的问题,并且不介意混合/桶方法。
关于mongodb - 如何在 MongoDB 中建模多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076923/