【问题标题】:Unique identifier as primary key when syncing databases同步数据库时作为主键的唯一标识符
【发布时间】:2011-05-27 21:06:03
【问题描述】:

我花了一天时间研究和测试在 Mac 上将 SQL Server 数据库与 CoreData 同步的不同方法。我已经测试了 INT 和 GUID(也是顺序 GUID)作为我的主键,尽管 GUID 在性能方面是迄今为止最差的,但我看不出没有其他方法可以确保跨系统的唯一性。

在平台之间同步数据时,将 GUID 用于主键是否是错误的方式?我很难相信公司在同步时会使用 GUID,但我阅读的有关该主题的大多数文章似乎都指向这一点。如果开发人员使用 GUID,有人知道如何提高性能吗?我尝试使用 GUID 作为非聚集索引的主键,并创建了一个日期字段作为我的聚集索引,但性能并没有太大的提升。

任何帮助都将不胜感激,特别是如果您解决了类似的问题。

【问题讨论】:

  • 两个答案都是正确的,但决定使用 Marks 解决方案作为具有非聚集索引的 PK 的 GUID 和具有聚集索引的 createdDate 字段。对于其他查看此问题的人,我使用我的配置对 50000 条与此 (fotia.co.uk/fotia/DY.19.NewSequentialId.aspx) 类似的记录进行了测试,并得到了与 NEWID 测试类似的结果。我没有大量数据,因此在这种情况下,为了良好的同步而牺牲性能是值得的。

标签: sql-server database-design synchronisation


【解决方案1】:

GUID 使同步变得更加容易。顺序 guid 将极大地缓解碎片问题,只留下 16 字节的列大小作为主要问题。

只要确保有另一个连续且窄的列作为聚集键,就可以为非聚集索引节省大量空间 - 似乎您已经知道这一点。

假设您不处理 GB 的数据,在这种情况下,性能不应受到 GUID 的影响,因为您已经妥善处理了 GUID 列。

如果您只需要同步两个系统,我之前创建了一个系统,其中 A 将使用标识 (-1,-1) 作为主键,而另一个系统使用标识 (1,1) 作为主键钥匙。这确保了轻松同步,同时保持主键良好和狭窄。但是,不适用于两个以上的系统。

【讨论】:

  • 感谢您的回答,它确实使很多场景。将会有其他系统进入同步组合,iPhone、iPad 等。但是这些都将使用 SQL Server 作为它们的主要数据源,但这并不意味着客户端将来不希望多设备同步在某些时候 :) 我打算使用顺序 GUID,但性能会丢失,因为在 Apple 设备(UDID)上生成的唯一 ID 将同步回主数据源(SQL Server),从而破坏索引和页面文件。
【解决方案2】:

同意,当您使用 GUID 时,您可能会遇到使用它作为键的索引的巨大碎片。确保跨系统唯一性的其他方法是

使用标识列并将它们播种到不同的非重叠范围:

1-100 million server A
100million1 -200 million server B 

或者使用复合键(identity int + location code)来区分数据的原始位置: 三个不同的行:

1 AB
1 BZ
1 XV

问候

彼得

【讨论】:

  • 我确实考虑过使用复合键标识 int + 设备类型 ID,但这可能有点混乱,并且可能会导致我的 aspnet mvc 路由出现问题,因为我必须创建类似的路由/user/3?deviceid=2 或类似的东西。
  • +1 用于“数据的原始位置”解决方案——唉,只有当您可以控制所述原始位置时,该解决方案才可能有效。
猜你喜欢
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2011-01-02
相关资源
最近更新 更多