我正在建立之前与 Jon Skeet 的讨论。
我的方案的要点如下:
- 客户端应用程序能够创建新的“PlaylistItem”对象,这些对象需要保存在数据库中。
- 用例要求以这样一种方式创建 PlaylistItem,即客户端在显示 PlaylistItem 之前不必等待来自服务器的响应。
- 客户端为 PlaylistItem 生成一个 UUID,在客户端显示 PlaylistItem,然后向服务器发出保存命令。
在这一点上,我明白在我的数据库中使用客户端生成的 UUID 作为对象的 PK 是不好的做法。原因是恶意用户可以修改生成的 UUID 并在我的数据库上强制 PK 冲突。
为了减轻因在 PlaylistItem 上强制发生 PK 冲突而造成的任何损害,我选择将 PK 定义为两个 ID 的组合 - 客户端生成的 UUID 和服务器生成的 GUID。服务器生成的 GUID 是 PlaylistItem 的播放列表的 ID。
现在,我已经使用这个解决方案一段时间了,但我不明白为什么/相信我的解决方案比简单地信任客户端 ID 更好。如果用户能够强制与另一个用户的 PlaylistItem 对象发生 PK 冲突,那么我认为我应该假设他们也可以提供该用户的 PlaylistId。他们仍然可以强制碰撞。
是的。做这样的事情的正确方法是什么?允许客户端创建一个 UUID,成功保存后服务器会竖起大拇指。如果发现冲突,恢复客户端更改并通知检测到冲突?