2012-07-10 80 views
2

我有一個只能在三種狀態的對象列表。什麼是在數據庫中表示三選項的最佳方式?

數據的簡單的例子:

Substance State 
H2O solid 
H2O fluid 
CO2 gas 
... ... 

是它更好地使用TINYINT(2)ENUM或別的什麼嗎?我應該直接插入值(VARCHAR)還是使用數字?值的外部表?

回答

1

我會經由ID reffer到外部表。然後表格將信息顯示爲文本。 在您的選擇語句中,您只需加入。如果你不知道我在說什麼,請問我一個例子:)

雖然,我不會使用ENUM,由於各種原因。在這裏找到最重要的:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

+0

謝謝你的鏈接!一切似乎都很清楚。 – aelita 2012-07-10 06:20:32

+0

請設置爲最佳答案或upvote,如果你想?謝謝:) – PoeHaH 2012-07-10 06:33:06

+0

我不能upvote,我還沒有足夠的聲望,對不起。 – aelita 2012-07-10 06:35:31

2

什麼都不會存儲在少於一個字節。

TINYINT(2)和一個包含3個成員的ENUM都會導致1個字節的存儲空間。要麼會沒事的。

關於ENUM的好處是您可以使用簡單的英文名稱,並且它們存儲緊湊。關於ENUM的壞處是它們不是ANSI SQL。

+0

對不起,我對這些東西很陌生。 >關於ENUM的好處是...它們被緊湊地存儲。 更緊湊嗎?我在我的數據庫中有大約10個這樣的字段,將選擇存儲在ENUM中而不是外部表中是否更好? – aelita 2012-07-10 06:29:54

+0

如果你有1到255個選項,它將使用1個字節。如果你有256到32,767的選擇,MySQL將使用2個字節。 – 2012-07-10 06:31:16

+0

我的意思是另一種領域。例如。狀態(固體,液體,氣體),顏色(紅色,綠色,藍色),大小(小,中等,大)等。 – aelita 2012-07-10 06:38:07

0

創建一個主表的狀態(ID INT,遞減爲varchar), 根據問題 將有

id | desc 
1 | Solid 
2 | Liquid 
3 | Gas 

,並在溶液(主)表參照狀態表的id

+0

我在數據庫中有大約10個這樣的字段,性能可以嗎? – aelita 2012-07-10 06:32:11

+0

@aelita:沒錯,它是一個完美的標準化設計.. – 2012-07-10 06:43:54

0

我認爲您可以將信息存儲在類型爲BIT的列中,並允許列中的空值爲

列。以下是價值和數據的映射。

H2O固體 - > TRUE

H2O流體 - > FALSE

CO2氣體 - > NULL

+0

任何理由,爲什麼這樣下來? – Narendra 2012-07-10 06:35:33

+1

可能是因爲BIT和TINYINT之間沒有什麼區別,而且過於黑客。對於一些數值,ENUM仍然是更好的總體回答。 – SilverbackNet 2012-07-10 06:40:21

+0

是的,但使用BIT有什麼錯誤? http://stackoverflow.com/questions/488811/tinyint-vs-bit – Narendra 2012-07-10 06:47:56

相關問題