Optimization 客户端是否能够可靠地为写入数据库的对象生成PK?

Optimization 客户端是否能够可靠地为写入数据库的对象生成PK?,optimization,client-server,primary-key,guid,Optimization,Client Server,Primary Key,Guid,我已经为这个进退两难的问题烦恼了一段时间,我想我应该这样做 关于我的场景的一点背景: 我的播放列表包含0个或多个播放项目子项 播放列表很少创建。因此,我可以从服务器请求GUID,等待响应,并且在成功时刷新UI以显示成功添加的播放列表 播放项对象经常创建。因此,当我等待服务器用UUID响应时,我有一条加载消息不正常 最后一个事实是一个优化,我知道,但我认为它极大地提高了程序的可用性 尽管如此,我还是想讨论一下在客户端唯一标识对象的选项。我将首先强调我尝试过但失败的两个选项,然后是我正在考虑的第

我已经为这个进退两难的问题烦恼了一段时间,我想我应该这样做

关于我的场景的一点背景:

  • 我的播放列表包含0个或多个播放项目子项
  • 播放列表很少创建。因此,我可以从服务器请求GUID,等待响应,并且在成功时刷新UI以显示成功添加的播放列表
  • 播放项对象经常创建。因此,当我等待服务器用UUID响应时,我有一条加载消息不正常
最后一个事实是一个优化,我知道,但我认为它极大地提高了程序的可用性

尽管如此,我还是想讨论一下在客户端唯一标识对象的选项。我将首先强调我尝试过但失败的两个选项,然后是我正在考虑的第三个选项。我希望能深入了解其他可能的解决方案


生成将持久化到服务器的PK UUID客户端。 这是我的第一选择。这是一个明显的决定,但有一些明显的缺点。这里的第一个问题是客户端UUID不能也不应该被信任用于这种目的。恶意用户可以轻松地强制PK冲突。此外,我的理解是,如果我选择在客户端生成UUID,我应该期望有更大的冲突机会。抓挠那个

根据播放列表GUID和在播放列表中的位置生成复合PK 我认为这是一个棘手的,但伟大的解决方案,我的问题。播放项的位置对于给定的播放列表集合是唯一的,
并且它可以从客户端和服务器端派生。这似乎是一个很好的解决办法。不幸的是,让我的位置成为PK的一部分打破了我PK的不变性。每当播放项被重新排序或删除时,都需要更新大量的播放项键。抓挠那个

基于播放列表GUID和自动递增的播放项目ID生成复合PK 此解决方案类似于上面的解决方案,但通过将复合密钥与位置分离来确保PK是不可变的。这是我正在玩弄的当前解决方案。我唯一担心的是,恶意用户可能会通过在发送之前修改客户端的自动递增id来强制冲突。我不认为这种恶意行为会对系统造成任何伤害,但有些事情要考虑。 好的!给你。我这么做是不是很愚蠢?我是否只是接受它并强制我的服务器为我的playlitem对象生成guid?或者,是否可以编写适当的实现

更新:

我希望在服务器成功保存到数据库之前,直观地表示用户的操作,并在保存失败时实施所需的恢复技术。我不确定这是否愚蠢,但我将通过一个用例场景来解释我的推理:

客户端希望添加新的播放列表项。为此,需要向YouTube的API请求创建播放项所需的所有信息。在YouTube的API响应后,客户端拥有创建播放列表项所需的所有信息,但唯一标识该项目的能力除外

此时,用户已经等待了YouTube API的X个时间段。现在,我想在客户端上直观地显示播放列表项。如果我选择等待服务器,我现在正在等待X+Y时间段,直到出现成功的视觉指示。在测试中,这种延迟感觉很尴尬


我的服务器只是亚马逊EC2上的一个微型实例。我可以通过升级硬件来减少Y时间段,但我可以通过巧妙的编程来完全消除Y。这就是我面临的困境。

好吧,当我在评论中提出这一点时,你似乎很喜欢:)

您可以使用高/低方法,这基本上允许客户端一次保留一组密钥。最简单的方法可能是使其成为一个由两个整数组成的复合主键。客户会接到一个电话,大意是“给我一把钥匙”。您将自动递增“下一个主键”序列,并记录哪个客户端“拥有”该主键。然后,该客户机可以在主密钥旁边使用任何次密钥,并且知道它们将与任何其他客户机隔离

当客户端执行插入时,您可以检查客户端是否使用了正确的主键,即分配给它们的主键


当然,另一种方法是只设置主键{client ID,UUID},让客户机只指定任何UUID…

不清楚客户机/服务器通信到底是什么。从服务器(在插入时生成)获取UUID是否真的比使用客户机提供的GUID进行插入需要更长的时间?或者在创建播放列表项时,您是否试图避免任何服务器交互,将插入推迟到以后?@JonSkeet我已根据您的问题使用其他信息更新了我的原始帖子。这有助于澄清我的问题吗?是的,谢谢。现在我只需要想一个解决办法。如果您愿意稍微信任客户机,可以使用高/低算法——有效地“保留”一组ID。然后,你可以跟踪客户实际提供的内容,如果他们淘气,你可以提供一个错误……这是一个非常天才的处理方式。随便想一想,我不着急。。。不过我还是要考虑一下这个建议。我从来没有考虑过这种可能性!我要这么做!你让我开心。如果出现任何问题,我会告诉你,但我怀疑这是“我一直在寻找的解决方案”。:)谢谢!这里有一些链接供试图理解这个概念的人使用。 , , •