DBLint 用于检查数据库状态。有 46 条规则。在 www.dblint.org 上对每条规则都有一些简单的解释,但规则 31 描述如下:
定义的主键不是最小键:主键是最小超键。如果定义的主键不是最小超键,则意味着可以识别出具有较少属性的行。当其他表需要引用超级键而不是主键时,它的吸引力就更小了。每个引用表都需要保存比实际需要更多的信息,从而导致使用更多空间和更低效率的索引。
这对我来说不是很清楚。如果有人可以解释一下,谢谢!
如果主键中的列的子集也可用于唯一标识行,则主键是超级键。
例子:
假设您有一个包含公司所有员工的表。每个人都有一个 id,但您还要求每个人都有一个唯一的别名,该别名由三个字母组成,用于登录名、电子邮件等。该表可以是:
create table employee
(
empID int not null auto_increment,
alias nvarchar(3) not null unique,
forname nvarchar(256) not null,
lastname nvarchar(256) not null,
constraint employee_pk primary key (empID, alias)
)
在此表中,主键是empID 和persons 三字母别名的组合,但empID 和别名都必须是唯一的,因此主键是超级键。仅使用列的子集(例如,empID 作为主键来唯一标识单个行)就足够了,因此这将是最小的超级键。