agn*_*zka 2 sql database-design primary-key
我最近看到一个数据库,其中有一个Types带有列的表Id,Key和Name.
Id只是该类型的ID,是该类型Key的短键名称,例如"啤酒",以及Name可以为用户显示的文本(例如,"我们最棒的啤酒").Id当然是独一无二的,是本表的主要关键.钥匙也很独特.其他表总是使用其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"啤酒"改为"啤酒",一些存储过程将停止正常工作(实际上存在这种情况).对我来说,非常直观的是,如果Id标识表中的行,我们应该始终使用id,因为其他属性可能会在需要时更改,并且不应该导致问题.我对吗?
Key是一种更有意义且易于理解的访问表中数据的方法.让我这样说吧:你宁愿调试一下吗?
SELECT ColumnA, ColumnB
FROM Table T
INNER JOIN Keys K
ON T.KeyId = K.KeyId
WHERE K.Key = 'Beer'
Run Code Online (Sandbox Code Playgroud)
要么
SELECT ColumnA, ColumnB
FROM Table T
WHERE T.KeyId = 103461
Run Code Online (Sandbox Code Playgroud)
当你不知道'103461'代表什么?
存储过程和其他参数化查询也是如此.你愿意看吗?
EXEC get_items_by_category 'Beer'
Run Code Online (Sandbox Code Playgroud)
要么
EXEC get_items_by_category 103461
Run Code Online (Sandbox Code Playgroud)
?答案应该是显而易见的.好的,可维护的代码是自我记录的,任意ID都无法提供.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |