在状态表中使用varchar主键

时间:2015-11-08 17:22:43

标签: sql sql-server

序言:我知道有很多关于Varchar主键的主题。我读过那些。这个问题略有不同,因为我只想在状态表上使用它。

我总是在表上使用int主键。

但是,我发现了一个边缘情况,实际上可能更好地使用varchar或char列。

边缘案例位于“状态”表中。例如,订单的状态可能为OPEN或FULFILLED。所以我的状态表只能容纳两行。

在编写查询时,我宁愿写:从Status ='OPEN'

的订单中选择*

然后写:从StatusId = 1; //

的订单中选择*

这有意义吗?我错过了什么吗?我是一个javascript开发人员,而不是一个sql人,所以我在这里采取了宝贝步骤。

我能看到的唯一缺点是它会在Orders表中占用更多的空间,并且连接可能会稍微慢一些。但可读性的回报似乎很重要。

1 个答案:

答案 0 :(得分:1)

纯粹主义者建议的规则通常有合理的例外(FROM条款中使用逗号除外;)

当涉及到表上的主键时,我倾向于成为纯粹主义者,希望所有这些都是自动递增的整数。这些有许多优点,例如:

  • 它们在索引方面效率更高。
  • 可以在不更改现有代码的情况下更改密钥的属性。
  • 外键引用可保证数据的准确性。

对于你的简单例子,我唯一能看到的缺点是第二个。如果有人出现并希望将“打开”更改为“打开”,则他们不能。鉴于状态值实际上不太可能在未来发生变化,这可能是一个非常小的考虑因素。索引不太可能只包含状态(除非你有更多的值)。此外,对于您拥有的值的数量,您可以使用tinyint作为表键,这样可以在每条记录中节省一些空间。

顺便说一下,如果status可能出现在多个表上,那么为此目的使用引用表是最有用的。否则,您可以使用检查约束:

constraint chk_status check (status in ('OPEN', 'FULFILLED'))

如果多个表共享相同的状态,我不建议这样做。