2012-01-18 67 views
2

Premesis:SQL主鍵自動增量VS時間戳

我知道,使用一個主鍵的最佳方式是設置字段作爲整數(增量或沒有)由於索引,但我在特定的情況...

我有一個程序脫機工作(在PC和平板電腦上)使用sqlite作爲數據庫。 用戶可以在程序和中央服務器之間同步數據(如雲)。 當用戶同步數據時,所有本地更新字段在服務器上更新,反之亦然。

使用在這種情況下主鍵自動增量是一個壞的解決方案,因爲如果兩個用戶在表中添加一個字段(兩個不同的設備上)我將有主鍵複製..

然後我又增加了字段包含用戶的ID,所以我已經通過形成一個索引: USER_IDFIELD_ID這樣的形勢的變化,但仍然有可能出現問題...

1)我不能有FIELD_ID爲AUTO_INCREMENT 2)上述問題仍然存在, 如果用戶保羅有兩個相同的設備da (同時同步),並且在設備1中,他在table_AAA上執行插入操作,並且他在table_AAA上執行了另一個插入操作,但是從設備2執行另一個插入操作,我將有一個重複索引(USER_ID/FIELD_ID)

因此,我轉換的FIELD_ID作爲由YYYYMMDDHHMMSSmmm組成VARCHAR(17),這種方式是非常不可能的用戶進行兩次操作在同一毫秒..

問題:

有沒有更好的辦法在我的情況下設置主鍵???

+0

只是一個想法,你說這是「相當不可能的」,兩個更新是在同一毫秒內完成的,但是如果系統時間被改變了怎麼辦? – 2012-01-18 10:04:21

+0

爲什麼複合主鍵不適合你? (user_id,device_id,field_id)?這不僅提供了唯一性,還特別定位數據的生成位置。無論您做什麼,都可以隨意使用時間戳*** ***除***作爲唯一標識符。你*將*最終得到衝突。 – MatBailie 2012-01-18 10:12:33

+0

我如何獲得Field ID? – Marcx 2012-01-18 11:34:41

回答

2

創建第二個唯一字段guid。您可以快速建立正常使用情況的索引,並可以獲得合併的獨特性。

+0

從技術上講,您可以創建兩個匹配的GUID。我不知道有多少宇宙生命週期會通過;)時間戳不能被認爲是唯一的,但是GUID *真的*可以被認爲是唯一的。 – MatBailie 2012-01-18 10:10:44

1

您應該有UUID作爲主鍵,爲了增加更多的清晰度,您可以添加一個device_id字段來區分行,但UUID應該就足夠了。

順便說一下,UUID的結果提升了,也就是表數據碎片不應該打擾你很多。