基本的なデータ モデルは、次の 3 つのオブジェクトで構成されます。
A: ObjectId id, String name, List of B objects
B: ObjectId id, String name
C: ObjectId id, reference to B object
タイプのオブジェクトであり、非常にまれにしか作成さA
れB
ません (月に 1 つのオブジェクトの可能性があります)。そして、すべての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 オブジェクトは、おそらく月に 1 回変更されます。C オブジェクトは決して変更されません。ただし、C オブジェクトは非常に頻繁に挿入されます (ピーク負荷は 1 秒あたり約 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 })
最も重要な質問は次のとおりです。これを頻繁に行うと、これら 2 つのバリアント間に大きなパフォーマンスの違いが生じるでしょうか?
おまけの質問:
すべての A オブジェクトに対して Unique 制約を設定できますか? これらすべての a.bList.id ObjectIds を一意にしたい ((!) グローバルに一意にする必要があることはわかっていますが、DB レベルに制約があると、より安全に感じられます)