簡體   English   中英

MySQL中ENUM數據類型的替代方法

[英]Alternative to ENUM Datatype in MySQL

我已將ENUM數據類型用於表中的字段,但其值不固定,例如將來可能會更改。 那么要實現的ENUM字段的替代解決方案是什么。

是采用引用表還是使列為varchar或integer?

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

另一個好處是,更改值不需要DDL命令( ALTER TABLE ),而是簡單的DML命令( INSERT INTOUPDATE )。 這樣甚至可以編寫一個簡單的管理程序。

例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM