2009-02-02 74 views

回答

48

這取決於你在做什麼:

  • 如果速度是主要的關注,然後一個普通的老int足夠大的可能。
  • 如果你真的會有超過20億(與B;))記錄,然後使用bigint或順序guid。
  • 如果您需要能夠輕鬆地與遠程創建的記錄同步,那麼Guid真的很棒。

更新
一些額外的(不太明顯)便籤的GUID:

  • 它們可苦了索引,並削減對數據庫性能的核心
  • 您可以使用順序guid來獲得一些索引性能,但放棄了第二點中使用的一些隨機性。
  • Guid可能很難手動調試(where id='xxx-xxx-xxxxx'),但您也可以通過連續指令獲取一些指令(where id='xxx-xxx' + '123')。
  • 出於同樣的原因,Guids可以使基於ID的安全攻擊變得更加困難 - 但並非不可能。 (您不能只輸入'http://example.com?userid=xxxx',並期望得到別人帳戶的結果)。
+1

這不是20億行嗎? INT已簽名。 – 2009-02-02 21:17:13

+1

;)好吧...我會脫掉我的-1 – 2009-02-02 21:25:40

+0

即使id是一個int,我還會使用一個額外的guid列來提供一個用於URL的查找......要麼是一個或另外的相關參數防止這種攻擊。 – 2009-02-02 21:31:27

7

一般來說,我建議在GUID之上使用BIGINT(因爲指令很大且很慢),但問題是,你甚至需要這個嗎? (也就是說你在做複製嗎?) 如果你預計少於20億行,那麼傳統的INT就可以。

0

這真的取決於進入的信息是否以某種方式連續。我強烈建議像用戶這樣的GUID可能會更好。但對於順序數據,如訂單或其他需要易於排序的數據,bigint可能是更好的解決方案,因爲它將被索引並提供快速排序而無需其他索引的成本。

1

並不取決於你的需要。 DB 性能將從整數獲得,而GUID對於複製有用,並且不需要從DB回聽已經創建了什麼標識,即代碼可以在插入行之前創建GUID標識。

0

這實際上取決於您是否期望在圖片中進行復制。複製需要一個UUID行,所以如果你打算這樣做,你最好先做。

1

如果您打算使用合併複製,那麼ROWGUIDCOL對性能有益(see here for info)。否則,我們需要更多關於「更好」定義的信息;什麼更好?

4

你在做複製嗎?或者你有銷售人員運行斷開的數據庫需要合併,使用GUID。否則,我會去一個int或bigint。從長遠來看,它們更容易處理。

0

除非你真的需要一個GUID,比如能夠在任何地方生成密鑰,而不僅僅是在服務器上,那麼我會堅持使用基於INTEGER的密鑰。創建GUID非常昂貴,並且難以真正查看數據。另外,你有沒有試過在SQL查詢中鍵入一個GUID?這是痛苦的!

0

我與安德魯羅林斯。

現在你可以爭論空間效率。 int是什麼,最多8個字節?指導將持續更長時間。

但我有兩個主要的偏好理由:可讀性和訪問時間。數字比GUID更容易(因爲我總是可以輕鬆地找到下一個/上一個記錄)。

至於訪問時間,請注意一些數據庫可能會出現GUID的BIG問題。我知道這是MySQL的情況(MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance)。這對於SQL Server來說可能不是什麼大問題,但需要注意的是。

我會說堅持INT或BIGINT。唯一一次我想你會希望得到GUID的是當你要放棄它,並且不希望人們出於安全原因能夠猜測其他記錄的ID時。

0

可以有更多方面或要求使用GUID。

  • 如果主鍵是任何數字類型(Int,BigInt或任何其他),那麼您需要將其設置爲Identity列,或者您需要檢查表中上次保存的值。
  • 在這種情況下,如果外表中的記錄被保存爲事務,那麼很難獲得主鍵的最後一個標識值。就像使用IDENT_CURRENT一樣,那麼在保存外鍵記錄時將會再次實現性能。
  • 因此,在保存與事務相關的記錄的情況下,首先爲主鍵生成Guid,然後將生成的鍵(Guid)保存在主表和外表中。
相關問題