表的最佳设计是什么,Type
字段是int
or char(1)
?换句话说,给定这个模式:
create table Car
(
Name varchar(100) not null,
Description varchar(100) not null,
VehType .... not null
)
VehType
成为 aint
或 a是否更有效(在性能方面)char(1)
?假设您有五种类型的汽车,您应该使用递增值 0 -> 4 还是类型的字符(例如,'v'、's'、'c'、't'、'm')?
如果不止于此,我会使用单独的 Type 表并具有外键关系,但我认为没有必要。
我注意到sys.objects
目录视图使用一个字符作为type
字段。这有什么原因吗?我只是在这里抓住空气,是我更舒服的吗?
您通常也会使用 1 字节的 tinyint
char(1) 会稍微慢一些,因为比较使用排序规则
困惑:什么是 S:SUV 或轿车或轿车或运动?
当您添加更多类型时,使用字母会限制您。见最后一点。
我见过的每个系统都有不止一个客户端,例如报告。将V、S变为“Van”、“SUV”等的逻辑需要重复。使用查找表意味着它是一个简单的 JOIN
可扩展性:再添加一种类型(“F”表示“ Flying car ”),您可以将一行添加到查找表或更改大量代码和约束。还有你的客户端代码,因为它必须知道 V、S、F 等是什么
维护:逻辑在 3 个地方:数据库约束、数据库代码和客户端代码。通过查找和外键,它可以在一个地方
使用单个字母的好处……呃,看不到任何
注意:有一个关于 Enums 的相关 MySQL 问题。建议也在那里使用查找表。
就像对伟大gbn 的回答的补充一样。
也许您可以创建类似的东西:
因此,在保持关系完整性(使用外键)的同时,您可以随心所欲地使用枚举。通过该
code
列,您可以随意使用您的字符代码,因此它将记录在数据库中(并且您可以直接从数据库中提取代码信息,而无需对系统集成的应用程序代码进行复杂的转换)。