1.多態性パターン:
- コンセプト: 同じコレクション内に異なる構造のドキュメントを保存します。共通フィールドは文書タイプを識別します。
- ユースケース: いくつかの共通フィールドを共有する関連データがあるが、タイプに基づいて個別のフィールドも持つ場合。たとえば、さまざまな種類の製品 (書籍、電化製品、衣類) を 1 つの「製品」コレクションに保存します。
- 例:
{ "_id": 1, "type": "book", "title": "The Book", "author": "John Doe" }
{ "_id": 2, "type": "electronics", "name": "Laptop", "brand": "XYZ", "processor": "Intel" }
ログイン後にコピー
2.属性パターン:
- コンセプト: キーと値のペアを使用して、ドキュメント間で大きく異なる可能性のある属性を表します。
- ユースケース: 固定フィールドにきちんと収まらないオプションまたは動的属性が多数ある場合。これにより、人口のまばらなフィールドを多数作成することが回避されます。
- 例:
{ "_id": 1, "name": "Product A", "attributes": { "color": "red", "size": "large", "material": "cotton" } }
{ "_id": 2, "name": "Product B", "attributes": { "weight": "2kg", "power": "100W" } }
ログイン後にコピー
3.バケットパターン:
- コンセプト: 関連データを 1 つのドキュメント (「バケット」) にグループ化します。
- ユースケース: 「多」側が比較的小さく、「1」側と一緒に頻繁にアクセスされる 1 対多の関係がある場合。これにより、必要な読み取り回数が減ります。
- 例: 同じドキュメント内にコメントを含むブログ投稿を保存します。
{ "_id": 1, "title": "My Blog Post", "content": "...", "comments": [
{ "author": "User A", "text": "Great post!" },
{ "author": "User B", "text": "I agree." }
]}
ログイン後にコピー
4.外れ値パターン:
- コンセプト: めったにアクセスされないデータや非常に大きなデータをメインのドキュメントとは別に保存します。
- ユースケース: 使用頻度が低いデータ、またはメインドキュメントのサイズが大幅に増加してパフォーマンスに影響を与えるデータがある場合。たとえば、大きな画像や詳細な商品説明を個別に保存します。
- 実装: 多くの場合、非常に大きなファイルの場合は GridFS を使用するか、別のドキュメントへの参照を保存することによって実装されます。
5.計算されたパターン:
- コンセプト: 読み取り操作中の負荷の高い計算を回避するために、事前に計算された値を保存します。
- ユースケース: 複雑な計算を必要とするデータに頻繁にアクセスする場合。計算値を保存すると、書き込みの複雑さは増加しますが、読み取りパフォーマンスは向上します (ソース データが変更されるたびに計算値を更新する必要があります)。
- 例: 個々の商品価格から計算された注文の合計価格を保存します。
6.サブセットパターン:
- コンセプト: 頻繁にアクセスされるフィールドのサブセットを、簡単に取得できるように埋め込みドキュメント内に保存します。
- 使用例: 大きなドキュメントがあるが、多くの場合、少数のフィールド セットのみが必要な場合。このサブセットを埋め込むと、ディスクから読み取られるデータの量が削減されます。
7.拡張参照パターン:
- コンセプト: 参照と、参照先ドキュメントのいくつかのキー フィールドを組み合わせます。
- 使用例: 関連ドキュメントからの情報が頻繁に必要になるが、毎回個別の検索を実行したくない場合。これによりクエリの数は減りますが、データの重複が発生します。
8.近似パターン:
- コンセプト: パフォーマンスを向上させるために、正確な値ではなく近似値を保存します。
- 使用例: 絶対的な精度は必要なく、パフォーマンスが重要な場合。たとえば、高価なカウント操作を実行する代わりに、推定カウントを保存します。
9.ツリーパターン:
- 概念: ネストされたドキュメントまたは参照を使用して、階層データ構造 (カテゴリや組織図など) を表します。
- 使用例: ツリーのような関係をモデル化する必要がある場合。親の参照、子参照、祖先の配列の使用など、さまざまなアプローチが存在します。
10.事前割り当てパターン:
- コンセプト: ドキュメント内の将来のデータ増加に備えてスペースを予約します。
- 使用例: 時間の経過とともにドキュメントが大きくなることがわかっていて (イベントの配列など)、パフォーマンスに影響を与える可能性があるドキュメントの頻繁なサイズ変更を避けたい場合。
11.ドキュメントのバージョン管理パターン:
- コンセプト: ドキュメントのさまざまなバージョンを保存し、経時的な変更を追跡できるようにします。
- ユースケース: データの変更履歴を維持する必要がある場合。これは、バージョンごとに新しいドキュメントを作成するか、メインドキュメントの配列内にバージョンを保存することによって実装できます。
適切なパターンの選択は、特定のアプリケーションの要件、データ構造、アクセス パターンに大きく依存します。多くの場合、最適なパフォーマンスと保守性を実現するために、これらのパターンを組み合わせて使用します。
以上がMongoDB のスキーマ設計パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。