外鍵應該是數字ID還是可以使用其他值?我目前使用ID,但我必須在驗證,插入等操作之前一直保持連接/查詢表來將值轉換爲ID。(除了輸入,我還在代碼中引用值而不是ID)例如,假設我有status
表 - 我可以不使用數字ID並只保留數值('active','suspended'等)?MySQL外鍵使用id或值?
這將主要用於資源/有些靜態表。
獎金問題:我需要在連接表中的id字段?我看不到他們的目的。
可能嗎?缺點?建議?
外鍵應該是數字ID還是可以使用其他值?我目前使用ID,但我必須在驗證,插入等操作之前一直保持連接/查詢表來將值轉換爲ID。(除了輸入,我還在代碼中引用值而不是ID)例如,假設我有status
表 - 我可以不使用數字ID並只保留數值('active','suspended'等)?MySQL外鍵使用id或值?
這將主要用於資源/有些靜態表。
獎金問題:我需要在連接表中的id字段?我看不到他們的目的。
可能嗎?缺點?建議?
外鍵也可以引用其他類型的列。
enum
如果您想有效使用幾個不同的字符串,建議使用。它們在內部是整數,但您可以使用它們的名稱。 mysql reference
您可以將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
僅僅出於性能方面的考慮,我只使用過的整數的FKS。 – 2012-02-11 22:20:35
@MikePurcell:所以,我假設你更喜歡自然鍵,對吧?我也是。 – 2012-02-11 22:30:28
確實。偉大的思想喝呃認爲一樣。 – 2012-02-11 22:35:40