2013-02-15 31 views
1

我設計了我的數據庫,並使用varchar來創建唯一的名稱。我做了一個表產品,每個產品都有一個產品代碼,而且這個代碼是唯一的,它不能重複,大多數情況下這是我父表中的主鍵。這個想法是,例如我有一支蠟燭,蠟燭有不同的顏色,所以不同的產品,我可以通過產品代碼使產品名稱明顯不同。我沒有使用或將一個表命名爲int類型的可索引id,並且在插入新項時auto_increments。我只是使用唯一的代碼作爲我的外鍵其他表的索引器。可以在MySQL表中使用字符串作爲您的ID嗎?

我不知道這是否是個好主意,我對PHP MySQL很陌生,在將值插入到不同的表中時遇到了一些問題,所以我使用產品代碼將它們鏈接起來。現在我只知道mysqli_insert_id這些東西可以很久以前解決我的問題。

所以,我可以只使用一個非標準的行ID的字符串類型的行ID?

+0

假設您在表格上有某種形式的索引,應該沒有問題。 – BenM 2013-02-15 15:13:04

+5

一個ID可以是任何你想要的。在內部使用int會更高效,但大多數可以使用一個唯一索引的東西都可以用作ID。 – 2013-02-15 15:13:20

+0

字符串類型主鍵與int類型的索引大小相比是否使索引大小更大? – SparKot 2013-02-15 15:15:47

回答

8

就我個人而言,我會說使用汽車公司ID。將您的產品代碼用作ID /主鍵意味着您不能(或將更難)在產品代碼後面更改產品代碼,這可能會導致問題。

要闡述:

如果你最終擴大你的數據庫,使您的產品鏈接到不同的表,使用一個產品代碼爲您的ID意味着,如果你想改變你的產品代碼,你將有更新所有表中的每個條目。使用不是產品代碼的ID意味着您只需在一個位置(庫存表)更新代碼,並且在加入庫存表以獲取產品代碼時,ID將完成剩餘的代碼。

+1

如果您擁有一個擁有大量表格的大型數據庫,那麼更改產品代碼意味着您必須更改不同表格中的大量不同數據。使用不是產品代碼的ID意味着您可以在一個地方更改產品代碼。我不是說你不能更新auto inc字段。 – webnoob 2013-02-15 15:15:18

+0

@Asaph他正在談論代理鍵的價值。自動更新並不重要,重要的是您要更新密鑰的可能性很大。如果你可以預見它的發生,你可以按照建議節省很多痛苦。 – 2013-02-15 15:22:17

+0

@TonyHopkinson - 這就是我的意思,我只是找不到優雅的話:) – webnoob 2013-02-15 15:23:37

1

可以這樣做,但只是因爲你可以,並不意味着你應該。理論上,主鍵不應該在數據庫之外有任何意義。根據定義,產品代碼在數據庫之外具有含義。

+3

這是什麼「理論」?在關係數據庫理論中,主鍵應該是數據本質上獨特的一個方面。 – 2013-02-15 15:16:37

+1

我不相信任何來自DB外部的數據具有真正獨特的方面(即SSN,員工子女的出生日期)。 – 2013-02-15 15:26:25

+3

哦,我們是否會對自然與替代鍵進行辯論? – 2013-02-15 15:28:05

3

字符串ID的巨大缺點是它會使索引(很大)變大,從而影響性能。

我會保持簡單,並使用標準自動增量int。

我也同意@ HD1和@webnoob答案 - 行ID應該由它描述值不變,獨立 - (在我看來)經典錯行ID是美國SSN或指派任何其他唯一號由政府給人或公司。

1

需要將字符串解析爲等同的(查詢,連接等)。所以,這有一個性能意義。這意味着如果可以的話,你應該避免它。

3

只要我們有關係數據庫,自然與代理鍵的優缺點將繼續爭論。我說:做你喜歡的事情,但是如果你打算使用代理人,儘量確保在可能的情況下,還有一種方法可以通過自然鍵來唯一標識行。

+0

關鍵字保存在我的銀行,我將盡快研究這個條款。 – 2013-02-15 15:36:41

2

任何獨特的[和理想的非變化]值,一組值可以用作數據庫中的鍵/主鍵。主要的原因是代理鍵[例如:自動增量INT列在MySQL的是如此普遍,是因爲:

  1. 很長一段時間外鍵是一個不走,[InnoDB的成爲可用最近才]和保持字符串鍵在幾個表中同步,沒有它們是一場噩夢。
  2. 字符串列上的索引具有一個長度,並且可以比列本身更短。這樣可以讓索引緊湊,但也會導致問題。例如:長度爲5的name列上的密鑰碰撞名稱Tom CruiseTom Clancy,因爲密鑰爲Tom C
+0

是啊!到目前爲止,我一直在使用InnoDB。我非常依賴xampp上的GUI來使我的任務更輕鬆,而無需鍵入SQL。我知道這是一個不好的做法,但是我確實理解我必須加快工作速度的語法。我發現我無法更改可索引/ FK行上的值,除非在父表上存在要替換的值。這真讓我感到困惑,但我總是因爲這個錯誤而導致FK無法更新子行上的密鑰。但是,感謝關於碰撞的人,我真的很遺憾,我沒有看到有人來了! – 2013-02-15 15:57:36

+0

它會解決問題,如果代碼是唯一的,不能重複? – 2013-02-15 15:58:42

相關問題