2012-07-10 83 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

相关问题