データの整合性
MongoDB は、アプリケーションを最適化するためにデータを正規化または複製する柔軟性を提供します。 スキーマ内でデータを重複させる場合、複数のコレクション間で重複したデータの整合性を保つ方法を決定する必要があります。 一部のアプリケーションでは重複したデータをすぐに整合性を持たせる必要がありますが、他のアプリケーションは古いデータの読み取りを許容できます。
ユースケース
アプリケーションでデータの整合性を強制するには、複数の方法があります。
方式 | 説明 | パフォーマンスへの影響 | ユースケース |
---|---|---|---|
複数のコレクションの更新は 1 つのアトミック操作で行われます。 | 読み取り競合による可能性が高い | アプリケーションは常に最新のデータを返す必要があり、読み取りが集中している期間中にパフォーマンスに悪影響が及ぶ可能性があります。 | |
アプリケーション スキーマを変更して、関連データを 1 つのコレクションに埋め込みます。 | ドキュメントのサイズとインデックスに応じて低から中程度 | アプリケーションは常に関連するデータを同時に読み取り、更新します。 このソリューションによりスキーマが簡素化され、 $lookup 操作が不要になります。 | |
1 つのコレクションで更新が発生すると、trigger は別のコレクションを自動的に更新します。 | 低から中程度で、trigger イベントの処理が遅れる可能性があります | アプリケーションは、少し古いデータの読み取りを許容できます。 更新の直後に、trigger が 2 番目のコレクションの更新を完了する前にクエリを実行すると、ユーザーには古いデータが表示される可能性があります。 |
データの整合性を強制する最良の方法は、アプリケーションによって異なります。 各アプローチのメリットと実装の詳細については、対応するドキュメント ページを参照してください。
タスク
アプリケーションでデータの整合性を強制するには、次のページを参照してください。
詳細
次の要因は、データ整合性を強制する方法に影響する可能性があります。
データの古さ
アプリケーションが最新のデータを返すことがどれだけ重要であるかを検討してください。 一部のアプリケーションでは、ユーザーに影響を与えない 分または 時間古いデータを返す場合があります。
たとえば、eコマース アプリケーションでは、ユーザーは商品が利用可能かどうかをすぐに把握する必要があります。 この情報は、頻繁に更新を必要とする場合でも、可能な限り一貫性を保つことが理想的です。
対照的に、分析クエリは通常、わずかに古いデータを読み取ることが予想されます。 分析データの一貫性を完全に保つことは重要ではありません。
アプリケーションの古いデータに対する許容度は、データの一貫性を保つ方法に影響します。 複数のコレクションのデータを頻繁に更新することで、ユーザーが古いデータを読み取られるリスクを軽減できます。 ただし、頻繁に更新を行うと、アプリケーションのパフォーマンスに悪影響が及ぶ可能性があります。 データの整合性を強制すると、ユーザーのニーズとパフォーマンスへの影響のバランスがとれます。
参照整合性
参照整合性により、オブジェクトが削除されると、そのオブジェクトへのすべての参照も削除されます。
たとえば、アプリケーションにproducts
コレクションと、 products
コレクションへの参照を含むwarehouse
コレクションがあるとします。 products
コレクションから製品が削除されると、 warehouse
コレクション内の対応する参照も削除する必要があります。
スキーマで参照の整合性が必要な場合は、参照の一貫性を保つためにロジックをアプリケーションに組み込みます。 少なくとも、アプリケーション ロジックは、存在しない参照をクエリしようとしたときにエラーを防ぐ必要があります。