MongoDBでは、リレーションシップ(一対一、一対多、多対多)を**埋め込み(embedding)または参照(referencing)**を通じてモデル化します。選択はリレーションシップのカーディナリティ、データへのアクセス方法、および共有されるかどうかに依存します。SQLの均一な外部キー方式とは異なり、MongoDBは関連性ごとに柔軟性を提供します。
一対一
{ : (), : , : { : , : } }
MongoDBでは、リレーションシップ(一対一、一対多、多対多)を**埋め込み(embedding)または参照(referencing)**を通じてモデル化します。選択はリレーションシップのカーディナリティ、データへのアクセス方法、および共有されるかどうかに依存します。SQLの均一な外部キー方式とは異なり、MongoDBは関連性ごとに柔軟性を提供します。
{ : (), : , : { : , : } }
// ONE-TO-FEW → embed (bounded, accessed together)
{ _id: ObjectId("..."), name: "Ann", addresses: [ {...}, {...} ] } // a few addresses
// ONE-TO-MANY → reference (the "many" side references the "one")
// authors collection: { _id: "a1", name: "Ann" }
// books collection: { _id: "b1", authorId: "a1", title: "..." } // each book references its author
// ONE-TO-SQUILLIONS (huge/unbounded) → ALWAYS reference (never embed unbounded data)
// e.g. a user with millions of log entries → separate collection, reference by userId
キーとなるニュアンス:一対少数(one-to-few) (埋め込む)、一対多(one-to-many) (多い側から参照)、一対無数(one-to-squillions) (常に参照 — 16MBドキュメント上限とパフォーマンスの理由により、無制限データは埋め込まない)。
// reference with an array of ids (on one or both sides)
{ _id: "s1", name: "Student", courseIds: ["c1", "c2"] } // student → courses
{ _id: "c1", name: "Course", studentIds: ["s1", "s2"] } // course → students (optional)
// → query and $lookup to resolve; or a separate "enrollments" collection (junction-like)
多対多は参照されるidの配列(片側または両側)を使用するか、豊富なリレーションシップデータのための分離された結合的なコレクションを使用します。
// join referenced data when needed
db.books.aggregate([
{ $lookup: { from: "authors", localField: "authorId", foreignField: "_id", as: "author" } }
]);
リレーションシップのモデル化はデータベース設計の基本であり、MongoDBの柔軟でアクセスパターン駆動型のアプローチはSQLの均一な外部キーと異なるため、MongoDBでリレーションシップをモデル化する方法を理解することは効果的なスキーマ設計に不可欠です。
キーとなる洞察は、MongoDBが埋め込みまたは参照を通じてリレーションシップをモデル化すること(リレーションシップの特性に基づいて) — そしてカーディナリティが選択にどう影響するかを理解することが重要なスキルです:一対一(通常は埋め込む — 一緒にアクセスされるため)、一対多(重要なニュアンスを含む)(一対少数 → 有界で一緒にアクセスされるデータの場合は埋め込む;一対多 → 多い側から参照;一対無数 → 常に参照、16MBドキュメント上限とパフォーマンスの理由により無制限データは埋め込まない)、および多対多(参照されるidの配列、または結合的なコレクション)。
is重要なスキルは、このカーディナリティ駆動の意思決定(特に、埋め込むには大きすぎるまたは無制限のデータがいつであるかを認識すること)で、無制限配列の埋め込み(ドキュメントの肥大化、制限への到達)や埋め込むべきデータの過度な参照などの一般的な間違いを避けることに不可欠です。
結合が必要な場合に$lookupで参照を解決する方法を理解することで完成します。
エンティティ間のリレーションシップはほとんどのデータモデルに内在しており、かつMongoDBの関連性ごとの柔軟なアプローチ(カーディナリティとアクセスパターンに基づいた埋め込み対参照)はSQLの均一な外部キーから根本的に異なりより複雑であるため、MongoDBでリレーションシップをモデル化する方法を理解する — カーディナリティベースの埋め込み/参照の意思決定(特に一対少数/多/無数の区別)と参照の解決 — は効果的なMongoDBスキーマ設計のための不可欠で頻繁に適用される知識であり、埋め込み/参照の基礎を構築してあらゆる実際のアプリケーションが持つリレーションシップを処理し、適切なMongoDBモデリングを幼稚な関係的ポートから区別する重要な領域です。