私はa previous discussion I had with Jon Skeetから外に出ています。クライアントで生成されたGUIDを信頼できないのはなぜですか? PKをクライアントGUIDとサーバーGUIDの複合体として扱うことは何も解決しますか?
次のように私のシナリオの要旨は次のとおりです。
- クライアントアプリケーションデータベースに永続化する必要がある新しい「PlaylistItem」オブジェクトを作成する能力を持っています。
- ユースケースでは、PlaylistItemを表示する前にクライアントがサーバーからの応答を待つ必要がないように、PlaylistItemを作成する必要があります。
- クライアントは、PlaylistItemのUUIDを生成し、クライアントにPlaylistItemを表示してから、サーバーにsaveコマンドを発行します。
この時点では、クライアントが生成したUUIDをデータベースのオブジェクトのPKとして使用することは悪い習慣であると私は理解しています。この理由は、悪意のあるユーザーが生成されたUUIDを変更し、自分のDBでPKの衝突を強制する可能性があるためです。
PlaylistItemでのPK衝突を引き起こすことに起因する損害を軽減するために、私はクライアント生成UUIDとサーバー生成GUIDの2つのIDの複合としてPKを定義することを選択しました。サーバーが生成したGUIDは、PlaylistItemのプレイリストのIDです。
私はこのソリューションをしばらく使用していましたが、なぜ私のソリューションが単にクライアントIDを信頼するよりも優れているとは思えません。ユーザーが別のユーザーのPlaylistItemオブジェクトとPK collisonを強制できる場合、そのユーザーのPlaylistIdも提供できると想定する必要があります。彼らはまだコリソンを強制することができます。
だから...はい。このようなことをする正しい方法は何ですか?クライアントがUUIDを作成できるようにします。サーバーは、正常に保存されたときに親指を上/下に表示します。衝突が見つかった場合は、クライアントの変更を元に戻し、検出されたcollisonを通知しますか?