0 primary-key relational-database functional-dependencies
题
主键是否在功能上决定了表中的所有其他属性?
我的想法
当然必须不是吗?这不是主键的重点吗?
表的超级键(UNIQUE NOT NULL 列集)是“在功能上确定表中所有其他属性”的列集。表的候选键(不包含更小的超级键的超级键)对于规范化很重要。主键只是一个可区分的候选键。
为什么要区分一个呢?
主键在关系理论中不起任何作用。主要的实际作用是通过其他表中的外键来识别行/实体/关联的一致性。
Codd(与理论相反)允许候选键列中存在 NULL。(SQL 也是如此。)来自他的“理解关系”文章:
与候选键相关的基本完整性原则是,对于每个基本关系,至少一个候选键被禁止采用空值。
通常,没有必要在多个候选键中禁止空值——因此,通常的做法是精确指定一个这样的键作为主键:即唯一禁止空值的候选键。
(DBMS、CASE 工具和 ORM 经常使用主键作为与候选键关联的默认值,通常是物理/实现键。但这引出了一个问题。)
因此,超级键起着标识作用,候选键是特殊的超级键,而主键并不是特别特殊的候选键。