我已经阅读了许多关于自然主键与代理主键之间之争的文章。我同意使用代理键来识别其内容由用户创建的表的记录。
但是在支持表的情况下我应该使用什么?
例如,在假设的表“orderStates”中。此表中的值不可编辑(用户不能插入、修改或删除此值)。
如果使用自然键将有以下数据:
TABLE ORDERSTATES
{ID: "NEW", NAME: "New"}
{ID: "MANAGEMENT" NAME: "Management"}
{ID: "SHIPPED" NAME: "Shipped"}
如果我使用代理键将有以下数据:
TABLE ORDERSTATES
{ID: 1 CODE: "NEW", NAME: "New"}
{ID: 2 CODE: "MANAGEMENT" NAME: "Management"}
{ID: 3 CODE: "SHIPPED" NAME: "Shipped"}
现在让我们举个例子:用户输入一个新订单。
在使用自然键的情况下,在代码中我可以这样写:
newOrder.StateOrderId = "NEW";
每次我有一个额外的步骤时,都使用代理键。
stateOrderId_NEW = .... I retrieve the id corresponding to the recod code "NEW"
newOrder.StateOrderId = stateOrderId_NEW;
每次我必须将订单移动到新状态时,都会发生同样的情况。
那么,在这种情况下,选择一种密钥类型而不是另一种的原因是什么?