2 つのコレクションがあり、それぞれが互いに独立した値を持ちますが、それぞれが互いに関連しているとします。photos
とですusers
。ユーザーと写真の間には 1 対多の関係があります。
非正規化データの例:
users:
{
"id": "AABC",
"name": "Donna Smith"
}
photos:
{
"id": "FAD4",
"description": "cute dog",
"user_id": "AABC", // This is the relationship
"user_name": "Donna Smith" // This is the denormalized value from the "users" collection
}
photos
ユーザー「AABC」が「Donna Smith」から「Donna Chang」に名前を変更したときに、コレクション内のドキュメントとの一貫性を確保するにはどうすればよいですか?
非トランザクションであるため、一貫性が最終的なものになることを理解しています。
単純な (単純な) 実装では、ユーザー "AABC" への変更後にバックグラウンド ジョブをトリガーして、user_id = "AABC" のすべての写真を更新することができます。そして、単一の更新の場合、それはうまく機能します. しかし、これはマルチユーザー環境であり、あらゆる方向に同時にアップデートが飛んでいきます。たとえば、「Donna Smith」を「Donna Chang」に変更するための写真のバックグラウンド更新の途中で、ユーザー「AABC」の名前が「Donna Smith」に戻された場合はどうなるでしょうか。
オンラインで検索すると、非正規化されたデータをモデル化する方法について多くの議論が見られます。しかし、それを維持する方法についての議論は、「関連するすべてのレコードも更新する必要がある」ため、些細なことのようです。このシナリオで面倒な作業を行う NoSQL システムはありますか? フレームワークやユーティリティはありますか?
「具体化されたビュー」のトピックに関する Thomas Waschik の優れたブログ記事と、まさにこのシナリオのバックグラウンド アップデートを読みました。しかし、私は次のことを心配しています:
- バックグラウンド ジョブは、更新に許可されている最大時間よりも大きい事前に決定された量だけ遅延する必要があります (その遅延をどのように決定しますか?操作に時間がかかる場合はどうなりますか?)。
- これは、実用的な解決策について私がまだ見つけた唯一の議論です。NoSQL は大したことではありますが、なぜこれについてこれ以上の議論が見られないのでしょうか? 私は何が欠けていますか?