以下面的例子为例,我试图找出设置MySql数据库的最佳方法。
FoodGroupTypeCode
:谷物,蔬菜,水果,乳制品,蛋白质
用于表示此属性的最佳数据类型是什么?
CHAR(1)
:G,V,F,D,P TINYINT
:使用数字代码(即Grain = 1,Vege = 2)ENUM
VARCHAR(9)
:使用全名选项4实际上不是我的考虑因素,除非有人能够真正验证它。我已经阅读了很多关于这个主题的“意见”,但是寻找更具体的原因来挑选一个。我感谢有人可以给予该学位的任何意见,而不是“我喜欢ENUM,因为它很快。”
答案 0 :(得分:2)
CHAR(1):G,V,F,D,P
高效,存储效率高,可编码。当我知道值是稳定的,并且当我需要将行为附加到代码时,我赞成这个解决方案。
(if code = 'G' then specific behaviour
)。
TINYINT:使用数字代码(即Grain = 1,Vege = 2)
性能高,存储效率高,但代码可读性较差。如果值发生变化(G最初为Grain,但现在变为Brain),此解决方案也不会产生混淆。这是最常见的。
<强> ENUM 强>
除了微小的性能优势之外,我没有看到使用枚举的单一好处。
当然,如果您确实遇到性能问题,那么小的性能提升将永远不够。
VARCHAR(9):使用全名
可读代码的结果。某些查询的联接较少,在这些特定情况下会提供性能优势。存储效率不高,如果要更改值,可能会给您带来问题。如果你有很多有很多行的表并且它们都引用了这个表,那么在你承担风险之前要仔细考虑。
答案 1 :(得分:1)
我会推荐ENUM,因为它会限制你对谷物,蔬菜,水果,乳制品,蛋白质的选择。
但是,在数据库中,我通常将此作为具有Check Constraint(只能是Grain,Vegetable,Fruit,Dairy或Protein)的VARCHAR(2),然后在我的应用程序中将其表示为ENUM或List。
答案 2 :(得分:1)
选择合适的数据类型完全取决于你将如何处理应用程序中的表数据(如果有的话),如果你有这个表只是为了存储记录而不是VARCHAR
将是一个更好的选择,因为它会使你的数据更加冗长,但是如果要对表数据进行处理,比如根据某些标准过滤结果,那么在应用程序逻辑中比较它们时,长名称可能会令人困惑,在这种情况下,CHAR
或TINYINT
将是更好的选择。虽然基于所使用的数据类型的性能影响应该是第二优先级。
答案 3 :(得分:0)
我使用CREATE TABLE FoodGroupType (id int unsigned not null auto_increment PRIMARY KEY, code VARCHAR(20), description VARCHAR(100)
。
所以食物表会看起来
CREATE TABLE Food (id int unsigned not null auto_increment PRIMARY KEY,
food_group_type_id int unsigned not null, name VARCHAR(50), description VARCHAR(100),
FOREIGN KEY(food_group_type_id) REFERENCES FoodGroupType(id) ON DELETE ... ON UPDATE ...
答案 4 :(得分:0)
我个人不会使用Char(1)或tinyint,因为它们不具有描述性。查看数据并不是那么清楚。 varchar和enum将是我会考虑的两个。我喜欢enum的想法,因为它确实是它的本质。你说所有食物都必须是这些食物中的一种。
另外我听说enum很快!