我最近看到一个数据库,其中有一个表 Types
,其中包含列 Id
、Key
和 Name
。
Id
只是该类型的一个 Id,Key
是该类型的短键名,例如“beer”,而 Name
是可以为用户显示的文本(例如,“我们最好的啤酒”)。 Id 当然是唯一的,并且是该表的主键。 key 也是独一无二的。其他表始终使用其 Id 列与表类型链接,但存储过程始终使用 Key 进行过滤(例如 "X inner join Types on X.type_Id = Types.Id where Types.Key = 'beer' "
而不是 "X.type_Id = 3"
)。
我认为这是一种糟糕的做法。我会使用 Id
而不是 Key
,即使我知道 Key
是唯一的。我认为 Key 有可能(并且可以)更改,但 Id 不应该更改,因为它在另一个表中用于链接。有没有不这样做的规则?我的意思是,如果我们将 Key
“beer” 更改为 “beers”,某些存储过程将停止正常工作(并且确实存在这种情况)。对我来说,如果 Id
标识表中的行,我们应该始终使用 id,因为其他属性可能会根据需要更改,这不会导致问题,这是非常直观的。我说得对吗?
最佳答案
Key
是访问表中数据的更有意义和更易于理解的方式。让我这样说吧:你愿意调试这个
SELECT ColumnA, ColumnB
FROM Table T
INNER JOIN Keys K
ON T.KeyId = K.KeyId
WHERE K.Key = 'Beer'
或者
SELECT ColumnA, ColumnB
FROM Table T
WHERE T.KeyId = 103461
当您不知道“103461”代表什么时?
存储过程和其他参数化查询也是如此。你宁愿看
EXEC get_items_by_category 'Beer'
或者
EXEC get_items_by_category 103461
?答案应该是显而易见的。好的、可维护的代码是 self 记录的,任意 ID 不能给你。
关于SQL存储过程设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/970500/