2014-01-17 104 views
5

說我有一個稱爲「狀態」的數據類型作爲一個MySQL表中的一行。狀態只能是固定數量的字符串,例如「活動」,「不活動」和「待處理」。哪種數據類型最適合使用?MySQL中固定數量字符串的最佳實踐?

  • 製作另一個表「狀態」,並在我的表中有一個指針ID?
  • 製作一個包含不同狀態的php數組,並使用我的狀態行作爲數組的索引?
  • 簡單地讓狀態是一個包含當前狀態的字符串?
+0

這聽起來像你想使用'ENUM'?輸入/輸出是字符串,但它只能是一組特定的值(並且以比VARCHAR更好的方式保存) – h2ooooooo

回答

1

如果這組狀態在開發時是固定的,那麼一定要使用ENUM。另一種情況是可能的狀態可以在運行時添加。在這種情況下,您希望使用分隔表來存儲它們和外鍵,以檢查所有狀態是否有效。

對此使用簡單的字符串是一種不好的做法。例如。只是一個小小的拼寫錯誤可能會破壞與特定行相關的所有內容。

-1

您可以按照任何你提出的三個選項,再加上你可以使用ENUM。

我會避免選擇號碼1

我會去(但它的編碼風格和喜好的問題)與選項NR。 3.將值存儲爲一個字符串,其中包含固定大小的字段,如char大小爲16的字符...

1

對於僅3個非可變長值,索引是不夠的。

對於有限的,固定數量的字符串使用SET類型是這樣的:

ALTER TABLE `table` ADD `status` SET('active', 'insactive', 'pending') NOT NULL 

和校驗字段的值,你可以通過它們的名字

('active', 'insactive', 'pending')或偶數(1 , 2 , 3)訪問它們。

例如,如果提交的值是活躍

if($value=="active") //returns TRUE 
if($value== 1) //returns TRUE too 
+0

[一個'SET'也可以包含一個空值(可能不需要) - 一個'ENUM'不能](http://stackoverflow.com/a/ 14798525/247893) – h2ooooooo

+0

那麼'NOT NULL'呢? –

+1

你知道你的'status'字段可以包含像'SET'一樣的'active,inactive'嗎?允許它很奇怪。爲什麼'SET'比'ENUM'好? – vbo