簡體   English   中英

Mysql數據類型 - Enum或不枚舉,Enum是否為空?

[英]Mysql Datatype - Enum or not to Enum, Can Enum be blank?

我有大型數據庫(數百萬行),我正在嘗試為2個字段的數據類型做出最佳選擇。 我做的大部分都是varchar或INT。 然而,2個領域我想知道Enum是否是最好的方式。

字段1第一個字段是性別,我的數據目前是“男性”或“女性”,或者可能是空白。 我最初設置如下:

GENDER VARCHAR(6) NOT NULL

這是最好的方式,還是最好將其設置為:

GENDER ENUM ('Male', 'Female') NOT NULL

我是否需要將其設為NOT NULL以允許空白,或者我是否需要添加空白,即

GENDER ENUM ('Male', 'Female', '') NOT NULL

更何況,我正在考慮將整個領域轉換為M或F.

字段2:除了狀態字段之外,我還有很多相同的事情需要考慮,其中包括52個值(50個狀態,DC,加上空白)。

我想最大的問題是 - 所有這些Enum的東西都值得嗎? 我的數據庫有數百萬行,所以一切都是一個因素,但我應該只使用VARCHAR(2)作為狀態而不是ENUM。

我經常適用於這種情況的經驗法則是不使用MySQL ENUM。 使用它們會產生維護問題,尤其是在添加/刪除/重命名某些值時。 在InnoDB中,重命名和刪除枚舉值在大表上很重要。 不添加值(只要您不在中間添加它)。

由於您可能希望將此列保留在上下文中,並且不允許任何值超出此上下文,因此IMHO使用INT的最佳方式是將其作為外鍵連接到值表(列id,值)。

您可以輕松地在此表中添加和重命名值,在刪除值之前,FK將強制處理主表中具有此值的任何現有記錄。

要輕松讀取數據,您只需要一個簡單的JOIN即可。

注意:既然性別是最終的,你可能想把它保留為VARCHAR(1)或使用像Johan建議的ENUM,但誰知道呢? 您可能希望將來支持跨性別者和雙性化。 不開玩笑。

如果你想要一個no value entered值的no value entered ,請使用null ,這就是為null設計的!

如果你想在男性和女性之間指定一些東西(一些不幸的人有這種情況),請使用

ENUM('male','female','neither') NULL;

需要注意的是一個枚舉存儲在列中的文字文本值。
male存儲為1, female存儲為2, neither為3等。
這意味着它比varchar更有效。

如果您在選擇中遇到null ,請注意您可以使用ifnullcoalesce函數將null替換為更有用的null

SELECT IFNULL(gender,'unknown') as gender FROM people;
-- or the identical statement
SELECT COALESCE(gender,'unknown') as gender FROM people;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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