同步数据库时唯一的标识符作为主键

问题描述:

我花了一天中最好的时间来研究和测试在Mac上与CoreData同步SQL服务器数据库的不同方法。我已经测试了INT和GUID(也是顺序的GUID)作为我的主键,虽然GUID是迄今为止性能最差的,但我看不出其他方式来确保跨系统的唯一性。同步数据库时唯一的标识符作为主键

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

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

+0

这两个答案都是正确的,但决定与Marks解决方案一起使用GUID作为具有非聚集索引的PK和具有聚集索引的createdDate字段。对于任何其他人看这个问题,我用我的配置跑50000记录类似于这个(http://www.fotia.co.uk/fotia/DY.19.NewSequentialId.aspx)的测试,并得到类似的结果NEWID测试。我没有大量的数据,所以在这种情况下,性能高于同步的性能是值得的。 – Cragly 2011-05-28 07:19:51

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

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

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

如果您只需要同步两个系统,我以前创建了系统,其中A将使用身份(-1,-1)作为主键,而另一个系统使用身份(1,1)作为主键首要的关键。这可以确保轻松同步,同时保持主键不错而且很窄。但是,对于两个以上的系统不适用。

+0

感谢您的回答,它确实提供了很多场景。还有其他系统将会进入同步混音,iPhone,iPad等。但是,这些都将使用SQL Server作为它们的主要数据源,但并不意味着客户端在某些时候不希望多个设备同步。)我打算继续使用顺序GUID,但性能将会丢失在Apple设备(UDID)上生成的唯一ID将会同步回主数据源(SQL Server),从而中断索引和页面文件。 – Cragly 2011-05-27 22:59:05

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

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

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

,或者使用组合键(身份INT +位置代码)来区分数据的原来的位置: 三种不同的行:

1 AB 
1 BZ 
1 XV 

问候

Piotr

+0

我曾考虑过使用组合键标识int +设备类型ID,但尽管这可能有点麻烦,并且可能会导致我的问题与我的aspnet mvc路由一致,就像创建类似于/ user/3的路由一样?deviceid = 2或某种性质的东西。 – Cragly 2011-05-27 23:05:49

+0

+1为“原始位置的数据”解决方案 - 这,唉,可能只有在你能控制所说的原始位置时才有效。 – 2011-05-27 23:07:04