2016-03-15 93 views
1

我已經使用ENUM數據類型表中的字段,但其值不固定,可能會在將來更改。那麼ENUM字段的替代解決方案是如何實現的。MySQL中ENUM數據類型的替代方案

請參考表或使列varchar或整數?

+1

要用作ENUM備用數據的最佳數據類型是tinyint –

回答

0

我喜歡使用varchar,然後在映射到正確值的代碼中聲明常量。我經常在列的評論中列出可能的值及其含義。

使用varchar比使用tinyint效率低(就像Aju John在他的評論中提到的那樣),但除非我正在處理一個真正關鍵性能或巨大的表 - 我發現處理起來更容易。它允許我在手動從表中選擇數據和調試代碼時(即不用記住每個數字意味着是否使用整數列)來理解實際值,並且在大多數情況下,效率和便捷之間的這種折衷是非常值得。

2

當你說未來價值可能會發生變化時,我認爲你回答了你自己的問題:你必須切換到一種數據存儲一次和中央位置的方法(而不是分散在整個數據庫中)。換句話說,一個主表。

另一個好處是對值的更改不需要DDL命令(ALTER TABLE),而是簡單的DML命令(INSERT INTO,UPDATE)。這甚至允許寫一個簡單的管理。

例如:

CREATE TABLE car (
    car_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    plate VARCHAR(20) NOT NULL, 
    color ENUM('White', 'Black', 'Red', 'Blue'), 
    PRIMARY KEY (car_id), 
); 

...被替換爲:

CREATE TABLE car (
    car_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    plate VARCHAR(20) NOT NULL, 
    color_id INT(10), 
    PRIMARY KEY (car_id), 
    CONSTRAINT car_fk1 FOREIGN KEY (color_id) REFERENCES color (color_id) 
); 

CREATE TABLE color (
    color_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    name VARCHAR(50) NOT NULL, 
    PRIMARY KEY (color_id), 
    UNIQUE INDEX name (name) 
); 

不用說,你可以重複使用在具有顏色的任何其他實體的顏色定義。

+0

您的意思是爲在表格中用作枚舉的所有值創建引用表的權利? –

+0

我想這樣...我不能給東西專名,因爲我不知道你的專欄代表什麼,但我已經給我的答案添加了一個例子(警告:代碼沒有經過測試。) –