2012-02-11 64 views
1

外鍵應該是數字ID還是可以使用其他值?我目前使用ID,但我必須在驗證,插入等操作之前一直保持連接/查詢表來將值轉換爲ID。(除了輸入,我還在代碼中引用值而不是ID)例如,假設我有status表 - 我可以不使用數字ID並只保留數值('active','suspended'等)?MySQL外鍵使用id或值?

這將主要用於資源/有些靜態表。

獎金問題:我需要在連接表中的id字段?我看不到他們的目的。

可能嗎?缺點?建議?

回答

2

外鍵也可以引用其他類型的列。

enum如果您想有效使用幾個不同的字符串,建議使用。它們在內部是整數,但您可以使用它們的名稱。 mysql reference

2

您可以將char或其他類型的列用作外鍵。問題是你的專欄會更寬。一個TINYINT,足以存儲256個不同的狀態,需要1個字節。 A CHAR(10),所以你可以存儲'Active','Suspended'等,需要10個字節。不僅行將更寬,而且索引也更寬。現代硬盤空間可能不成問題,但索引大小也會影響效率。

所以,是的,如果您可以容忍性能下降,那麼您可以取消數字ID並僅保留這些值。

或者,你可以使用CHAR(1)作爲status表的主鍵(和關閉過程中的其他表外鍵),所以你可以有'A',爲'Active''S''Suspended',等它的工作原理,如果你不沒有超過26種不同的狀態。

的MySQL ENUM類型有幾個問題,由Bill Karwin這裏的答案描述:Mysql ENUM type vs join tables

+0

僅僅出於性能方面的考慮,我只使用過的整數的FKS。 – 2012-02-11 22:20:35

+0

@MikePurcell:所以,我假設你更喜歡自然鍵,對吧?我也是。 – 2012-02-11 22:30:28

+0

確實。偉大的思想喝呃認爲一樣。 – 2012-02-11 22:35:40