MongoDB - リレーションシップ
こんにちは、将来のプログラマーたち!今日は、MongoDBのリレーションシップの魅力的な世界に飛び込みます。あなたの近所の親切なコンピュータサイエンスの先生として、この旅を案内することを楽しみにしています。プログラミングが初めての方也不用担心——基本から始めて、段階的に進めていきます。では、コーヒー(またはお気に入りの飲み物)を飲みながら、始めましょう!
MongoDB リレーションシップの理解
本題に入る前に、データベースの文脈でリレーションシップとは何か話しましょう。大きな家族聚会を組織するとします。家族の一員、彼らの住所、そしてポットラックに持参する料理の情報があります。これらのデータをどう整理するでしょうか?それがリレーションシップです!
MongoDBでは、データ間のリレーションシップを表現する主な方法が2つあります:
- 埋め込みリレーションシップ
- 参照リレーションシップ
それぞれ詳しく見ていきましょう。
埋め込みリレーションシップのモデル化
埋め込みリレーションシップは、ナレッジドールのように——小さな情報を大きな情報の中に埋め込みます。このアプローチは、密接に関連しており、頻繁に一緒にアクセスされるデータに最適です。
例:家族の一員とそのペット
家族の一員とそのペットの情報を保存したいとします。埋め込みリレーションシップを使用して以下のようにできます:
db.familyMembers.insertOne({
name: "John Doe",
age: 35,
pets: [
{ name: "Fluffy", type: "Cat", age: 3 },
{ name: "Rex", type: "Dog", age: 5 }
]
})
この例では、次の通りです:
-
familyMembers
コレクションにドキュメントを插入します。 - ドキュメントには、John Doeの基本情報が含まれています。
-
pets
フィールドは、Johnのペットの各ドキュメントを含む配列です。
この構造は素晴らしい reasonで、Johnとそのペットに関する全ての情報を1つのクエリで容易に取得できます:
db.familyMembers.findOne({ name: "John Doe" })
埋め込みリレーションシップを使用すべき場合
埋め込みリレーションシップは以下の場合に最適です:
- 埋め込まれたデータは、親ドキュメントと常に一緒にアクセスされます。
- 埋め込まれたデータは親に特有で、独立してクエリされる必要はありません。
- 埋め込まれたデータは比較的小さで、無限に増えることはありません。
MongoDBでは、1つのドキュメントは16MBを超えられません。したがって、非常に大量の埋め込まれたデータを扱う場合、参照リレーションシップを検討するべきです。
参照リレーションシップのモデル化
参照リレーションシップは、家族聚会のゲストリストを作成するようなものです。すべての情報を1か所に置かず、必要に応じて参照します。
例:家族の一員とその住所
複数の家族の一員が共有される住所を保存したいとします:
// まず、住所を插入します
db.addresses.insertOne({
_id: ObjectId(),
street: "123 Main St",
city: "Anytown",
state: "CA",
zipCode: "12345"
})
// 次に、住所への参照を含む家族の一員を插入します
db.familyMembers.insertOne({
name: "Jane Doe",
age: 32,
addressId: ObjectId("...") // 住所ドキュメントのObjectId
})
この例では、次の通りです:
- まず、
addresses
コレクションに住所を插入します。 - 次に、
familyMembers
コレクションに家族の一員を插入し、住所のObjectIdを保存します。
Janeの完全な情報(住所を含む)を取得するためには、ルックアップを実行する必要があります:
db.familyMembers.aggregate([
{ $match: { name: "Jane Doe" } },
{ $lookup: {
from: "addresses",
localField: "addressId",
foreignField: "_id",
as: "address"
}}
])
このクエリは:
- Jane Doeのドキュメントをマッチします。
- 住所情報を結合するためのルックアップを実行します。
参照リレーションシップを使用すべき場合
参照リレーションシップは以下の場合に有益です:
- 関連データが大きく、埋め込むと16MBのドキュメントサイズ制限を超える可能性がある場合。
- 関連データが複数のドキュメント間で共有され、複数の場所で更新する必要がある場合。
- 関連データを独立してクエリする必要がある場合。
埋め込みリレーションシップと参照リレーションシップの比較
以下の表に、主要な違いをまとめます:
要素 | 埋め込みリレーションシップ | 参照リレーションシップ |
---|---|---|
データの場所 | 同じドキュメント内 | 別のドキュメント |
クエリパフォーマンス | 関連データの取得が速い | 追加のルックアップが必要 |
データの重複 | データの重複が発生する可能性がある | データの重複を減少 |
更新の複雑さ | ドキュメント内での更新がシンプル | 複数のドキュメント間での更新が必要 |
柔軟性 | 共有データには灵活性が低い | 複数のドキュメント間で共有されるデータには灵活性が高い |
ドキュメントサイズ | 16MBのドキュメントサイズ制限 | 関連データセットが大きい場合に対応可能 |
結論
さて、皆さん!MongoDBのリレーションシップの世界を旅しました。埋め込みリレーションシップと参照リレーションシップの両方を探求しました。覚えておいてください、一括の解決策はありません——最適なアプローチは特定のユースケースによります。
MongoDBの冒険を続ける中で、以下の概念を頭に入れておいてください:
- 埋め込みリレーションシップは、密接に関連しており、頻繁にアクセスされるデータに最適です。
- 参照リレーションシップは、共有または大きなデータセットに対応します。
- クエリパターンとデータの成長を常に考慮して選択します。
実践は完璧を生みますので、異なるモデルで実験することを恐れずに。次回の聚会で家族のデータ整理のエキスパートになるかもしれません!
幸せなコーディングを、そしてデータベースが常に完璧な調和を保つことを祈っています!
Credits: Image by storyset