2009-02-03 26 views
12

我們有今天早上有關如何將應存儲我們的ID爲我們製作了一些資產,我們已經在我們的數據庫中,descusion產生一點點熱量,所以我決定來諮詢的SO專家會議。爲主鍵使用項目特定的前綴和自動編號?

表結構即我相信,我們應該有(短版)是這樣的:

實施例1)

  • 由assetid - INT(32) - 主鍵
  • 類型 - 字符串

所以一些示例數據是這樣的:

==AssetId======Type=== 
    12345  "Manhole" 
    155415  "Pit" 

團隊的另一名成員建議是這樣的:

例2)

  • 由assetid - 字符串 - 主鍵
  • 類型 - 字符串

所以一些示例性數據是這樣的:

==AssetId======Type=== 
    "MH12345" "Manhole" 
    "P155415" "Pit" 

,我們做的那種類型的短版本,並將它附加到ID的前面,並將其存儲在數據庫中。我見過一些資產數據庫可以做到這一點,並且從來沒有真正採用這種方法。

我從來沒有真正喜歡使用字符串爲排列原因ID的想法。無論如何,當您已經擁有資產商店類型時,我也覺得它只是爲了存儲無用的信息。

你會採取什麼方法?爲什麼?使用2號方法1有什麼好處?

編輯:是的,我將使用AUTO_INCREMENT的方法1.

+0

似乎有幾個答案 - 包括當前接受的答案 - 誤解了例2作爲自然主鍵,即包含實際業務數據的鍵。也許你可以稍微澄清一點,因爲示例2中的鍵似乎只是代理鍵 - 它們與行的業務數據沒有關係 - 但帶有額外的表指定前綴。 – 2009-12-18 06:44:08

回答

25

通常,經驗法則是永遠不要在主鍵中使用有意義的信息(如社會安全號碼或條形碼)。只是普通的自動增量整數。不過,數據看起來不變 - 它可能會在一個點上發生變化(新的立法出現,所有的SSN都會重新計算)。

+2

是的!在過去的三家公司中,我曾經因爲一些白癡選擇了一個「自然」的鑰匙而遭受了很大的痛苦。 UPC被回收;不是每個人都有一個SSN;人們搞砸了創造SKU。你存儲它,你可以獨特它,但PK是你的關係的祕密號碼。你不要暴露它。 – 2009-02-26 05:41:03

4

我會去前。創建唯一ID應留給SQL服務器,如果它們是字符串,則不能以線程安全方式自動創建這些ID。根據我的理解,你不得不自己處理這個問題?

速度是另一個因素。處理int值始終會比字符串更快。我會說,大約有索引等PERF的好處,更加精明的SQL比人可能我詳細闡述;)

以我的經驗,有字符串ID已經失效。

2

我個人認爲第一種方法是遠遠更好。它可以讓數據庫軟件進行簡單的整數比較以找到並按鍵進行排序,這將提高表操作性能(SELECT,複雜JOIN,按鍵INDEX查找等)。)

當然,我假設無論哪種方式,您正在使用某種自動遞增方法來生成ID - 序列,AUTO_INCREMENT或類似的東西。幫我一個忙,不要在程序代碼中創建這些代碼,好嗎?

+0

是的我會使用AUTO_INCREMENT的方法1.(添加到帖子) – 2009-02-03 06:34:02

7

這是surrogate and natural keys之間的決定,第一個是代理(或「技術」),第二個是自然的。

我得出結論,你應該幾乎總是使用代理鍵。如果你使用自然鍵,那些可能會改變,更新主鍵/外鍵通常不是一個好主意。

+0

這是一個有趣的觀點,但它不回答這個問題,因爲例子1和2都是代理鍵。 ;-) – 2009-12-17 16:25:53

0

如果您的資產已具有唯一的自然標識符(例如員工及其員工標識),請使用它們。創建另一個唯一標識符沒有意義。另一方面,如果沒有自然唯一的ID,則使用最短的那個ID來確保預期的表大小足夠(例如整數)。它需要更少的磁盤空間,可能會更快。此外,如果您發現自己需要稍後使用基於字符串的密鑰,則這是一個簡單的替換作業:

  • 將資源表的主鍵添加到資產表。
  • 將字符串外鍵添加到引用表中。
  • 使用整數關係更新與簡單UPDATE命令的字符串關係。
  • 爲sting列添加外鍵約束。
  • 刪除整數列的外鍵約束。
  • 完全刪除整數列。

其中某些步驟可能在特定DBMS上有問題,可能需要使用表卸載/重新加載來刪除整數主鍵列,但該策略基本上是需要的。

3

嗯,我想使一些要點和建議,

  • 考慮爲一類單獨的表,說與列標識和說明,然後做一個外鍵TYPEID此表。爲了使事物正常化更進一步。但它可能並不理想。如果你認爲它服務於某種目的,那就去做吧

  • 如果以後你們想到轉向UUID,那麼使它成爲字符串是有意義的。你並不需要更改數據類型,然後

[編輯]

我克萊圖斯這裏同意。這個代理關鍵證明在一些現實生活中是有益的。他們允許改變,而且你很清楚,改變是唯一不變的。

1

我更喜歡示例1,因爲您提到的原因,我可以想到的使用示例2的唯一參數是如果您嘗試從現有數據庫容納字符串ID(很常見),但即使在該場景中,我寧願使用以下方法。

==AssetId(PK)==Type========DeprecatedId==== 
    12345  "Manhole" "MH64247" 
    155415  "Pit"  "P6487246" 
0

示例2的唯一優點是,只需從主鍵就可以輕鬆判斷出該鍵適用於哪個表的哪一行。這個想法很好,但它是否有用取決於您的日誌記錄和錯誤消息策略。它可能有一個性能上的缺點,所以我不會使用它,除非你能指出爲什麼要使用它的一些具體原因。 (你也可以通過使用全局序列來生成數字鍵,或者通過使用不同的數字範圍,最後一位數字或其他值來獲得這個優勢,那麼你沒有性能上的缺點,但是也許你找不到表很容易。)

3

我會選擇數字主鍵出於性能原因。整數比較比字符串比較便宜得多,並且它將在數據庫中佔用較少的空間。

相關問題