2

公式文書によると、通常は「手動参照」操作が推奨され、経験豊富な人は 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回のクエリで結果を取得することを提唱していますが、リレーショナルデータを保存する必要がある場合は、「手動参照」を使用することを「提案」します。 「テーブル結合」を使用すると、一度だけクエリが実行されます。

これは私には意味がありません:)

4

1 に答える 1