功能依赖和主键

Functional Dependencies and Primary Keys

问题

主键是否在功能上确定 table 中的所有其他属性?

我的想法

当然不是吗?这不就是主键的意义吗?

在至少符合第一范式的table中,主键决定table中的每个属性。正如您所说,这就是主键(以及一般的候选键)的意义所在。

根据定义,关系的 all 超键(不仅仅是主键)和其中的 all 属性之间存在函数依赖关系关系(不仅仅是非关键属性)。

A table 的 superkeys(UNIQUE NOT NULL 列集)是 "functionally determine every other attribute in the table" 的列集。 table 的 候选键 (不包含更小超级键的超级键)对于规范化很重要。 主键只是一个可区分的候选键。

为什么区分一个?

  • 主键在关系理论中没有任何作用。主要实际作用是在其他 table 中通过外键识别 rows/entities/associations 的一致性。

  • Codd(与理论相反)允许在候选键列中使用 NULL。 (和 SQL 一样。)来自他的 "Understanding Relations" 文章:

    A basic integrity principle associated with candidate keys is that, for every base relation, at least one of the candidate keys is prohibited from taking on null values.

    Normally, it will not be necessary to prohibit null values in more than one candidate key -- hence, the common practice of designating precisely one such key as the primary key: i.e., the only candidate key for which null values are prohibited.

  • (DBMS、CASE 工具和 ORM 通常使用主键作为与候选键关联的默认值,通常是 physical/implementation 个。但是这个 begs the question。)

所以超键起到标识作用,候选键是特殊的超键,主键不是特别特殊的候选键。