2015-11-08 63 views
1

序言:我知道有很多關於Varchar主鍵的主題。我讀過這些。這個問題略有不同,因爲我只想在狀態表上使用它。在狀態表中使用varchar主鍵

我總是在表上使用int主鍵。

但是,我發現了一個邊緣情況,它可能實際上更好地使用varchar或char列。

邊緣案例處於「狀態」表中。例如,一個訂單可能具有OPEN或FULFILLED的狀態。所以我的狀態表只能保存兩行。

在編寫查詢,我寧願寫:SELECT * FROM訂單,其中狀態= 'OPEN'

然後寫:SELECT * FROM訂單,其中StatusId = 1; //

這是否有道理?我錯過了什麼?我是一個JavaScript開發人員,而不是一個SQL人員,所以我正在這裏採取寶貝步驟。

我能看到的唯一缺點是它會佔用Orders表中稍多的空間,並且連接可能會稍微慢一點。但可讀性的回報似乎很重要。

回答

1

通常有合理的例外是純粹主義者提出的規則(除使用FROM子句中的逗號)

我傾向於是一個純粹的,當涉及到對錶的主鍵,希望所有的人自動遞增整數。這些有很多優點,如:

  • 它們在索引中更高效。
  • 可以在不更改現有代碼的情況下更改密鑰的屬性。
  • 外鍵引用保證數據的準確性。

舉個簡單的例子,我可以很容易看到的唯一缺點就是第二個。如果有人出現並想要將「OPEN」改爲「OPENED」,他們就不能。這可能是一個非常小的考慮因素,因爲狀態值在未來實際上不可能發生變化。索引不太可能只包含狀態(除非你有更多的值)。而且,對於您擁有的值的數量,您可以使用tinyint作爲表鍵,這將在每條記錄中節省一點空間。

順便說一句,如果status可能出現在多個表上,順便說一下,使用參考表來實現此目的非常有用。否則,您可以使用檢查約束:

constraint chk_status check (status in ('OPEN', 'FULFILLED')) 

如果多個表共享相同的狀態,我不會推薦此操作。