[英]Alternative to ENUM Datatype in MySQL
我已將ENUM數據類型用於表中的字段,但其值不固定,例如將來可能會更改。 那么要實現的ENUM字段的替代解決方案是什么。
是采用引用表還是使列為varchar或integer?
我認為當您說未來價值可能會改變時,您回答了自己的問題:您必須切換到一種方法,即一次將數據存儲在一個中央位置(而不是分散在整個數據庫中)。 換句話說,一個主表。
另一個好處是,更改值不需要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)
);
不用說,您可以在具有顏色的任何其他實體中重用顏色定義。
我喜歡使用varchar,然后在代碼中聲明映射到適當值的常量。 我經常也在該列的注釋中列出可能的值及其含義。
使用varchar的效率比使用tinyint的效率低(如Aju John在他的評論中建議的那樣),但是除非我要處理的是性能至關重要的表或龐大的表,否則我會發現它更容易處理。 當我從表中手動選擇數據以及調試代碼時,它使我能夠了解實際值(即,無需記住每個數字在使用整數列時的含義),並且在大多數情況下,效率和便利性之間的權衡是非常值得。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.