公式文書によると、通常は「手動参照」操作が推奨され、経験豊富な人は DBrefを使用しないことを提案しています。その後、リレーショナル コレクションを使用してエンティティをクエリする場合に、クエリを 2 回実行するとパフォーマンスがどれだけ低下するかを真剣に懸念しています。従来のリレーショナル DB では、テーブル結合を使用して 1 回のクエリで期待される結果を取得できます。
非正規化の例:
db.blogs.insert({
_id: 1,
title: "Investigation on MongoDB",
content: "some investigation contents",
post_date: Date.now(),
permalink: "http://foo.bar/investigation_on_mongodb",
comments: [
{ content: "Gorgeous post!!!", nickname: "Scott", email: "foo@bar.org", timestamp: "1377742184305" },
{ content: "Splendid article!!!", nickname: "Guthrie", email: "foo@bar.org", timestamp: "1377742184305" }
]}
)
db.blogs.find() を使用するだけで、必要なものをすべて取得できます。コメント付きのブログ投稿はそれらに属します。
正規化の例:
db.books.insert({
_id: 1,
name: "MongoDB Applied Design Patterns",
price: 35,
rate: 5,
author: "Rick Copeland",
ISBN: "1449340040",
publisher_id: 1,
reviews: [
{ isUseful: true, content: "Cool book!", reviewer: "Dick", timestamp: "1377742184305" },
{ isUseful: true, content: "Cool book!", reviewer: "Xiaoshen", timestamp: "1377742184305" }
]
}
);
db.publishers.insert({
_id: 1,
name: "Packtpub INC",
address: "2nd Floor, Livery Place 35 Livery Street Birmingham",
telephone: "+44 0121 265 6484",
}
);
1 冊の本に関する完全な情報を取得したい場合は、以下のように手動で 2 回クエリを実行する必要があります。
> var book = db.books.find({ "name": { $regex: 'mongo*', $options: 'i' } })
> db.publishers.find({ _id: book.publisher_id })
私が知っていることは次のとおりです。優先操作はMongoによって「メモリ内」で処理されますが、以下に要約された質問があります。
簡単に言えば、ドキュメント指向データベースは、データを「非正規化」して1回のクエリで結果を取得することを提唱していますが、リレーショナルデータを保存する必要がある場合は、「手動参照」を使用することを「提案」します。 「テーブル結合」を使用すると、一度だけクエリが実行されます。
これは私には意味がありません:)