データモデリングにおける重要な問題は、アプリケーションのニーズ、データベースエンジンのパフォーマンス特性、データ取得パターンのバランスを取ることです。 データモデルを設計する際は、アプリケーションの使用状況( ハードウェア メトリクスを収集できるようにします。
柔軟なスキーマ
データを挿入する前にテーブルのスキーマを決定して宣言する必要がある SQL データベースとは異なり、MongoDB のコレクションはデフォルトで、ドキュメントが同じスキーマを持つ必要は ありません 。 つまり、
単一のコレクション内のドキュメントは同じフィールド セットを持つ必要はなく、フィールドのデータ型はコレクション内のドキュメントで異なっていても構いません。
新しいフィールドの追加、既存のフィールドの削除、フィールド値を新しいタイプに変更するなど、コレクション内のドキュメント構造を変更するには、ドキュメントを新しい構造に更新します。
この柔軟性により、ドキュメントをエンティティまたはオブジェクトにマッピングすることが容易になります。 各ドキュメントは、ドキュメントがコレクション内の他のドキュメントと大きく異なる場合でも、表されたエンティティのデータ フィールドと一致することができます。
ただし、実際には、コレクション内のドキュメントは同様の構造を共有するため、更新および挿入操作中にコレクションに対してドキュメント検証ルールを強制できます。 詳細については、「スキーマの検証」を参照してください。
ドキュメント構造
MongoDB アプリケーションのデータモデルを設計する際の重要な決定点は、ドキュメントの構造と、アプリケーションがデータ間の関係を表す方法に関係します。 MongoDB では、単一のドキュメント内に関連データを埋め込むことができます。
埋め込みデータ
埋め込みドキュメントは、関連するデータを単一のドキュメント構造に保存することで、データ間の関係をキャプチャします。 MongoDB ドキュメントを使用すると、ドキュメント内のフィールドまたは配列にドキュメント構造を埋め込むことができます。 これらの非正規化された データモデルにより、アプリケーションは 1 回のデータベース操作で関連データを検索および操作できます。
MongoDB の多くのユースケースでは、非正規化データモデルが最適です。
埋め込みドキュメントの利点と脆弱性については、「埋め込みデータモデル」を参照してください。
参考文献
参照とは、あるドキュメントから別のドキュメントへのリンクや参照を含めることで、データ間の関係を保存するものです。 アプリケーションはこれらの参照を解決して関連データにアクセスできます。 大まかに言えば、これらは正規化された データモデルです。
参照使用の強度と脆弱性については、「正規化されたデータモデル」を参照してください。
書込み操作の不可分性
単一ドキュメントのアトミック性
MongoDB での書込み操作は、単一のドキュメント内の 複数の埋め込みドキュメントを変更する場合でも、単一のドキュメント レベルで アトミック です。
データが埋め込まれた非正規化データモデルは、複数のドキュメントやコレクションにわたって正規化するのではなく、関連するすべてのデータを 1 つのドキュメントに組み合わせます。 このデータモデルはアトミック操作を容易にします。
MongoDB のトランザクションの詳細については、「トランザクション」ページを参照してください。
マルチドキュメントトランザクション
単一の書き込み操作(例: db.collection.updateMany()
) は複数のドキュメントを変更します。各ドキュメントの変更はアトミックですが、操作全体はアトミックではありません。
複数のドキュメントへの書込み操作を実行する場合、1 回の書込み操作でも複数の書込み操作でも、他の操作がインターリーブすることがあります。
MongoDB は(単一または複数のコレクション内の)複数のドキュメントへの読み取りと書込みにアトミック性を必要とする状況で、レプリカセットやシャーディングされたクラスターでのトランザクションを含む分散トランザクションをサポートします。
詳細についてはトランザクションを参照してください。
重要
ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。
トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。
Tip
データ使用とパフォーマンス
データモデルを設計するときは、アプリケーションがデータベースをどのように使用するかを考慮してください。 たとえば、アプリケーションが最近挿入されたドキュメントのみを使用する場合は、 Capped コレクションの使用を検討してください。 または、アプリケーションのニーズが主にコレクションへの読み取り操作である場合は、一般的なクエリをサポートするためにインデックスを追加するとパフォーマンスが向上します。
データモデルの設計に影響するこれらやその他の運用上の考慮事項の詳細については、「運用上の要因とデータモデル」を参照してください。
詳細
MongoDB University
ドキュメントを構造化し、スキーマを定義する方法については、MongoDB University のデータ モデリングコースをご覧ください。