基本数据模型由 3 个对象组成:
A: ObjectId id, String name, List of B objects
B: ObjectId id, String name
C: ObjectId id, reference to B object
类型的对象A
并且B
很少被创建(可能是每个月的对象之一)。每个A
对象将只包含几个(= 1-5)个B
对象。如果我使用嵌入,它看起来像这样:
{
id : ObjectId(...),
name : "some A name",
bList : [
{
id : ObjectId(...),
name : "some B name"
},{
id : ObjectId(...),
name : "some other B name"
}
]
}
C 类型的对象将始终如下所示:
{
id : ObjectId(...),
bReference : ObjectId(...)
}
我不能将 C 嵌入到 B 中,因为 C 对象的数量可能是无限的(= 连接到单个 B 对象的数百万个条目)。
A 和 B 对象可能每月修改一次。C 对象永远不会被修改。但是 C 对象会被非常频繁地插入(峰值负载应该是每秒大约 20 次插入)。
问题/问题:
每次我查询 C 类型的文档时,我都需要来自引用的 B 文档的一些信息(有时还需要来自 A 文档的信息)。例如,我需要检查是否允许我访问 C 对象:
c = db.c.find({ ... })
a = db.a.find({ bList.id : c.bReference })
// do something with the access permission information from within a.
如果我需要来自 A 和 B 的信息,这似乎很不错。正确的?
但是,如果我只需要 B 文档中的信息(通常是这种情况)怎么办?
c = db.c.find({ ... })
b = db.a.find({ bList.id : c.bReference }, { bList.$ : 1 })
如果我查询多个 C 对象,它们将始终(!)引用同一个 B 对象。使用非嵌入式数据库设计时,查询将如下所示:
c = db.c.find({ ... })
b = db.b.find({ _id : c.bReference })
最重要的问题是:如果我经常这样做,这两种变体之间会不会有巨大的性能差异?
奖金问题:
我可以对所有 A 对象设置唯一约束吗?我想让所有这些 a.bList.id ObjectIds 都是唯一的(我知道它们应该(!)是全局唯一的,但是对 DB 级别的约束让我感觉更安全)