Primary key SPA中表的GUID或ID

Primary key SPA中表的GUID或ID,primary-key,guid,breeze,single-page-application,identity-column,Primary Key,Guid,Breeze,Single Page Application,Identity Column,今天下午,我和同事们讨论了guid相对于身份字段作为主键的优点。来自大数据背景的我本能地选择了IDENTITY,但他们更倾向于使用面向web的guid 大多数优点和缺点都有很好的文档记录,并在这里进行了精辟的总结: 但我的同事提出了一个我无法回答的问题,谷歌也无法回答,我认为这是一个有趣的问题。在单页应用程序风格的系统中,javascript模型(即Breeze JS)通常用于在提交之前临时保存许多可能的数据库更改,以减少服务器往返。这增加了表的标识字段由于同时进行另一次插入而增加的可能性。当

今天下午,我和同事们讨论了guid相对于身份字段作为主键的优点。来自大数据背景的我本能地选择了IDENTITY,但他们更倾向于使用面向web的guid

大多数优点和缺点都有很好的文档记录,并在这里进行了精辟的总结:

但我的同事提出了一个我无法回答的问题,谷歌也无法回答,我认为这是一个有趣的问题。在单页应用程序风格的系统中,javascript模型(即Breeze JS)通常用于在提交之前临时保存许多可能的数据库更改,以减少服务器往返。这增加了表的标识字段由于同时进行另一次插入而增加的可能性。当然,当你试图做出承诺时,这会导致混乱


在这种情况下,特别是考虑到SPA通常在数据库级别没有性能瓶颈,使用GUID是否更明智?还是我们夸大了堆叠多个更改以提交的潜在问题?

不确定我是否回答了您的问题,但如果您将标识列与Breeze一起使用,则Breeze会在保存之前自动为任何新实体生成临时id值。在服务器上,一旦生成“真实”ID,Breeze将临时到真实ID的映射发送回客户端,并修复客户端ID以匹配新的“真实”ID。标识值的生成完全由数据库在保存过程中处理,因此在使用标识列时,无意中重用ID并导致提交失败不会产生实际问题。该工件是,成功完成保存后,所有“添加”记录(涉及标识或服务器生成密钥的记录)的ID将自动更改

也就是说,如果您使用guid,那么这些都不是必需的。不需要修复,客户端ID不会因保存而更改。guid确实倾向于比标识列大一点,并且“可能”比标识列显示更少的局部性(因此可能导致较慢的保存)。i、 它们通常分散在数据库中,而不是附加到现有表中。(顺序guid部分补偿了这一点)


这两种技术都是可行的,都有支持者。但在所有条件相同的情况下,我个人更喜欢guid。我喜欢简单

不确定我是否在回答您的问题,但如果您将标识列与Breeze一起使用,则Breeze会在保存任何新实体之前自动为其生成临时id值。在服务器上,一旦生成“真实”ID,Breeze将临时到真实ID的映射发送回客户端,并修复客户端ID以匹配新的“真实”ID。标识值的生成完全由数据库在保存过程中处理,因此在使用标识列时,无意中重用ID并导致提交失败不会产生实际问题。该工件是,成功完成保存后,所有“添加”记录(涉及标识或服务器生成密钥的记录)的ID将自动更改

也就是说,如果您使用guid,那么这些都不是必需的。不需要修复,客户端ID不会因保存而更改。guid确实倾向于比标识列大一点,并且“可能”比标识列显示更少的局部性(因此可能导致较慢的保存)。i、 它们通常分散在数据库中,而不是附加到现有表中。(顺序guid部分补偿了这一点)


这两种技术都是可行的,都有支持者。但在所有条件相同的情况下,我个人更喜欢guid。我喜欢简单

正如Jay所说,不必担心存储生成ID的竞争条件。Breeze使用临时密钥,这些密钥被解析为数据库层上的永久密钥。不用担心

但我通常也更喜欢guid,原因完全不同,这是由于我作为一个对服务器端效率不太感兴趣/不太关心的客户端开发人员所面临的问题

分布式应用程序(如Breeze应用程序)中使用GUI的最佳原因是离线场景更容易支持。在导出和导入实体时,临时键(Breeze处理得很好)无法正常工作。。。在客户端存储(例如浏览器存储)中存储未保存的新实体时的状态。即使你不离线,这种模式也很有用;当用户在工作流中移动时,我经常将未保存的工作隐藏在本地。。。以防他/她意外关闭浏览器

老实说,guid对服务器端人员来说并不是什么大问题。您可以使用受时间影响的guid(例如GuidComb)解决碎片问题。存储和索引性能问题随着h/w速度的提高和DBs的改进而减少。唯一需要查看代理密钥的人是开发人员;我们受苦受累

我写了很多演示,毫无疑问,使用整数标识键可以让作者和读者更轻松地完成这项工作。我认为演示并不能提供合理的指导

实际上,我混合使用关键数据类型,即使它们不是标识。我的静态引用实体(查找:状态、美国州等)和很少更改的实体(产品目录中的产品)通常是整数键。它们更容易阅读和设置(顺便说一句,存储起来也更容易)。客户机经常创建的实体(例如,订单)使用guid


没有一个答案。你的里程数会有所不同。在这里插入陈词滥调。

正如Jay所说,不必担心存储生成ID的竞争条件。Breeze使用临时密钥,这些密钥被解析为数据库层上的永久密钥。不用担心

但我通常也更喜欢guid,原因完全不同,这是由于我作为一个对服务器端效率不太感兴趣/不太关心的客户端开发人员所面临的问题