我有一個只能在三種狀態的對象列表。什麼是在數據庫中表示三選項的最佳方式?
數據的簡單的例子:
Substance State
H2O solid
H2O fluid
CO2 gas
... ...
是它更好地使用TINYINT(2)
或ENUM
或別的什麼嗎?我應該直接插入值(VARCHAR)還是使用數字?值的外部表?
我有一個只能在三種狀態的對象列表。什麼是在數據庫中表示三選項的最佳方式?
數據的簡單的例子:
Substance State
H2O solid
H2O fluid
CO2 gas
... ...
是它更好地使用TINYINT(2)
或ENUM
或別的什麼嗎?我應該直接插入值(VARCHAR)還是使用數字?值的外部表?
我會經由ID reffer到外部表。然後表格將信息顯示爲文本。 在您的選擇語句中,您只需加入。如果你不知道我在說什麼,請問我一個例子:)
雖然,我不會使用ENUM,由於各種原因。在這裏找到最重要的:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/
什麼都不會存儲在少於一個字節。
TINYINT(2)和一個包含3個成員的ENUM都會導致1個字節的存儲空間。要麼會沒事的。
關於ENUM的好處是您可以使用簡單的英文名稱,並且它們存儲緊湊。關於ENUM的壞處是它們不是ANSI SQL。
創建一個主表的狀態(ID INT,遞減爲varchar), 根據問題 將有
id | desc
1 | Solid
2 | Liquid
3 | Gas
,並在溶液(主)表參照狀態表的id
我在數據庫中有大約10個這樣的字段,性能可以嗎? – aelita 2012-07-10 06:32:11
@aelita:沒錯,它是一個完美的標準化設計.. – 2012-07-10 06:43:54
我認爲您可以將信息存儲在類型爲BIT的列中,並允許列中的空值爲
列。以下是價值和數據的映射。
H2O固體 - > TRUE
H2O流體 - > FALSE
CO2氣體 - > NULL
任何理由,爲什麼這樣下來? – Narendra 2012-07-10 06:35:33
可能是因爲BIT和TINYINT之間沒有什麼區別,而且過於黑客。對於一些數值,ENUM仍然是更好的總體回答。 – SilverbackNet 2012-07-10 06:40:21
是的,但使用BIT有什麼錯誤? http://stackoverflow.com/questions/488811/tinyint-vs-bit – Narendra 2012-07-10 06:47:56
謝謝你的鏈接!一切似乎都很清楚。 – aelita 2012-07-10 06:20:32
請設置爲最佳答案或upvote,如果你想?謝謝:) – PoeHaH 2012-07-10 06:33:06
我不能upvote,我還沒有足夠的聲望,對不起。 – aelita 2012-07-10 06:35:31