ホームページ >ウェブフロントエンド >jsチュートリアル >MongoDB での効率的なデータ モデルの設計: スキーマレス、リレーションシップ、パフォーマンスの最適化
MongoDB は、通常は BSON (バイナリ JSON) を使用してドキュメントの形式でデータを保存するため、スキーマレスです。コレクション内の各ドキュメントは独自の構造を持つことができます。つまり、フィールドとそのデータ型を事前に定義する必要はありません。
例:
この柔軟性により、MongoDB はスキーマの変更を必要とせずに、変化するデータ モデルに適応できます。
MongoDB は、ドキュメント間の関係をモデル化するための 2 つの主なアプローチ、埋め込み と 参照 を提供します。
埋め込み: 関連データを 1 つのドキュメント内に保存します。
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
参照: 関連データを別のドキュメントに保存し、参照 (つまり、ObjectId) を使用してそれらをリンクします。
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
1 対多の関係は、通常、「1 つの」ドキュメント内に「多数」の項目を埋め込むか、参照することによってモデル化されます。
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
// Parent document { "_id": 1, "name": "John" } // Child document { "addressId": 1, "street": "123 Main St", "city": "City A" }
上限付きコレクションは、サイズ制限に達すると最も古いドキュメントを自動的に上書きする固定サイズのコレクションです。上限付きコレクションは、ログやイベント データなど、最新のデータが最も重要であるシナリオに最適です。
特徴:
例:
サイズ制限が 1MB、ドキュメントが最大 1000 個の上限付きコレクションを作成します:
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
MongoDB では、ドキュメント サイズ がパフォーマンスに直接影響を与える可能性があります。ドキュメントの最大サイズは 16MB です。このサイズに近いドキュメントは次の可能性があります:
パフォーマンスを向上させるには、ドキュメントをコンパクトに保ち、特に書き込み量の多い環境での過度の増大を避けることが重要です。
非正規化 では、結合の必要性を減らすために複数のドキュメント間でデータをコピーします。関連データを埋め込むことで、MongoDB は複数のクエリや結合の実行を回避し、読み取りの高速化につながります。
例: 注文で製品を参照する代わりに、製品の詳細を注文文書に直接埋め込みます:
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
GridFS は、MongoDB で大きなファイル (16MB を超える) を保存および取得するための仕様です。大きなファイルをチャンク (通常は 255 KB) に分割し、それらを 2 つのコレクション (fs.files と fs.chunks) にドキュメントとして保存します。
例: 大きな画像ファイルの保存:
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
階層データの場合、階層の深さと複雑さに基づいて埋め込みまたは参照を使用できます。
{ "_id": 1, "name": "John Doe", "orders": [ { "orderId": 101, "total": 50 }, { "orderId": 102, "total": 75 } ] }
// Customer document { "_id": 1, "name": "John Doe" } // Order document { "orderId": 101, "customerId": 1, "total": 50 }
TTL インデックスは、指定された期間が経過するとコレクションからドキュメントを自動的に削除します。これは、セッション情報やログなどの有効期限が切れるデータに役立ちます。
構文:
{ "_id": 1, "name": "John", "addresses": [ { "street": "123 Main St", "city": "City A" }, { "street": "456 Elm St", "city": "City B" } ] }
多対多の関係は、各ドキュメントに参照の配列を埋め込むか、関係を保存する 3 番目のコレクションを作成することによってモデル化できます。
// Parent document { "_id": 1, "name": "John" } // Child document { "addressId": 1, "street": "123 Main St", "city": "City A" }
db.createCollection("logs", { capped: true, size: 1048576, max: 1000 })
MongoDB は柔軟なスキーマ設計機能を提供し、複雑な関係やデータ モデリング戦略を含むさまざまなユースケースに適応できます。適切なスキーマ設計を選択すると、アプリケーションのパフォーマンスとスケーラビリティが向上します。
こんにちは、アバイ・シン・カタヤットです!
私はフロントエンドとバックエンドの両方のテクノロジーの専門知識を持つフルスタック開発者です。私はさまざまなプログラミング言語やフレームワークを使用して、効率的でスケーラブルでユーザーフレンドリーなアプリケーションを構築しています。
ビジネス用メールアドレス kaashshorts28@gmail.com までお気軽にご連絡ください。
以上がMongoDB での効率的なデータ モデルの設計: スキーマレス、リレーションシップ、パフォーマンスの最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。