2011-05-27 118 views
1

我花了一天中最好的時間來研究和測試在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

回答

2

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

2

同意,當您使用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