类型字段的 INT 或 CHAR

Tho*_*ger 18 database-design sql-server datatypes

表格或Type字段的最佳设计是什么?换句话说,鉴于此架构:intchar(1)

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)
Run Code Online (Sandbox Code Playgroud)

VehType成为 anint或 a是否更有效(在性能方面)char(1)?假设你有五种类型的汽车,你应该使用递增值 0 -> 4,还是类型的字符(比如;'v'、's'、'c'、't'、'm')?

如果不止于此,我将使用单独的 Type 表并具有外键关系,但我认为没有必要这样做。

我注意到sys.objects目录视图为type字段使用了一个字符。有什么原因吗?我是否只是在稀薄的空气中抓住了它,这是我更舒服的吗?

gbn*_*gbn 19

您通常也会使用 tinyint,它也是 1 个字节

  • char(1) 会稍微慢一些,因为比较使用排序规则

  • 困惑:什么是 S:SUV 或Saloon 或 Sedan或 Sports?

  • 当您添加更多类型时,使用字母会限制您。见最后一点。

  • 我见过的每个系统都有不止一个客户端,例如报告。将 V、S 变为“Van”、“SUV”等的逻辑需要重复。使用查找表意味着它是一个简单的 JOIN

  • 可扩展性:再添加一种类型(“F”代表“飞行汽车”),您可以将一行添加到查找表或更改大量代码和约束。还有你的客户端代码,因为它必须知道 V、S、F 等是什么

  • 维护:逻辑在 3 个地方:数据库约束、数据库代码和客户端代码。通过查找和外键,它可以在一个地方

使用单个字母的好处是......呃,看不到任何

注意:有一个关于 Enums的相关MySQL 问题。建议也在那里使用查找表。

  • 很棒的点。这让我想知道为什么其他人确实使用 char(1) (如 sys.objects)。 (2认同)
  • sys.objects 的历史可以追溯到 Sybase 和 SQL Server 的早期版本 http://en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis 如果您查看系统对象,您可以看到代码而不是 ID:但在新的 DMV。至于除了MS之外的其他人?考虑 RDBMS 而不是 OO/Enums,使用 Lookups 是有意义的。 (2认同)