序言:我知道有很多关于Varchar主键的主题。我读过那些。这个问题略有不同,因为我只想在状态表上使用它。
我总是在表上使用int主键。
但是,我发现了一个边缘情况,实际上可能更好地使用varchar或char列。
边缘案例位于“状态”表中。例如,订单的状态可能为OPEN或FULFILLED。所以我的状态表只能容纳两行。
在编写查询时,我宁愿写:从Status ='OPEN'
的订单中选择*然后写:从StatusId = 1; //
的订单中选择*这有意义吗?我错过了什么吗?我是一个javascript开发人员,而不是一个sql人,所以我在这里采取了宝贝步骤。
我能看到的唯一缺点是它会在Orders表中占用更多的空间,并且连接可能会稍微慢一些。但可读性的回报似乎很重要。
答案 0 :(得分:1)
纯粹主义者建议的规则通常有合理的例外(FROM
条款中使用逗号除外;)
当涉及到表上的主键时,我倾向于成为纯粹主义者,希望所有这些都是自动递增的整数。这些有许多优点,例如:
对于你的简单例子,我唯一能看到的缺点是第二个。如果有人出现并希望将“打开”更改为“打开”,则他们不能。鉴于状态值实际上不太可能在未来发生变化,这可能是一个非常小的考虑因素。索引不太可能只包含状态(除非你有更多的值)。此外,对于您拥有的值的数量,您可以使用tinyint
作为表键,这样可以在每条记录中节省一些空间。
顺便说一下,如果status
可能出现在多个表上,那么为此目的使用引用表是最有用的。否则,您可以使用检查约束:
constraint chk_status check (status in ('OPEN', 'FULFILLED'))
如果多个表共享相同的状态,我不建议这样做。