SQL存储过程设计问题

标签 sql database-design primary-key

我最近看到一个数据库,其中有一个表 Types,其中包含列 IdKeyName

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/

相关文章:

sql - 使用存储在表中的正则表达式作为 SQL 查询的条件

mysql 表中多个外键指向同一个主键

带名称的 MySql 主键约束

sql-server - 金融交易系统数据库架构设计原则?

mysql - MySQL 中的多值属性

sql-server - 桌面应用程序的新闻数据库设计

sql - 检索 Oracle 最后插入的 IDENTITY

Mysql 'match against' 具有多个条件

mysql - quartile 和 StDev 在 SQL 中怎么写?

mysql - VB.Net 中的内连接