Jon Skeet との以前の議論に基づいて作成しています。
私のシナリオの要点は次のとおりです。
- クライアント アプリケーションには、データベースに永続化する必要がある新しい「PlaylistItem」オブジェクトを作成する機能があります。
- ユース ケースでは、PlaylistItem を表示する前にクライアントがサーバーからの応答を待つ必要がないように、PlaylistItem を作成する必要があります。
- クライアントは PlaylistItem の UUID を生成し、クライアントに PlaylistItem を表示してから、保存コマンドをサーバーに発行します。
この時点で、クライアントによって生成された UUID をデータベース内のオブジェクトの PK として使用するのは適切ではないことを理解しています。これは、悪意のあるユーザーが生成された UUID を変更し、DB で PK の衝突を強制する可能性があるためです。
PlaylistItem で PK の衝突を強制することで発生する損害を軽減するために、PK を 2 つの ID (クライアント生成の UUID とサーバー生成の GUID) の合成として定義することにしました。サーバーによって生成された GUID は、PlaylistItem のプレイリストの ID です。
さて、私はしばらくの間このソリューションを使用してきましたが、なぜ私のソリューションが単にクライアント ID を信頼するよりも優れているのか理解できません。ユーザーが別のユーザーの PlaylistItem オブジェクトとの PK 衝突を強制できる場合、そのユーザーの PlaylistId も提供できると想定する必要があります。彼らはまだ衝突を強制することができました。
だから...ええ。このようなことをする適切な方法は何ですか?クライアントが UUID を作成できるようにします。サーバーは、正常に保存されたときに親指を立てたり下げたりします。衝突が見つかった場合、クライアントの変更を元に戻し、衝突が検出されたことを通知しますか?