sql 数据库:table 有 2 列(id 名称)和 2 个主键第三范式 Boyce-Codd 范式

sql database: table with 2 column (id name) and 2 primary key Third Normal Form Boyce-Codd Normal Form

想象以下 table。就我而言,我完全确定 name 需要 uniquenot null [unique+not null = primary key]。因此 name 是一个主键。由于某些原因(可能是习惯),我很自然地创建了一个int类型的主键id列。

其他假设:我绝对需要在我的 table 中保留 name 并且我绝对确定 namevarchar 类型)永远不会超过 20 个字符.

现在我的第一个问题是[可能是预期是或否的关闭问题]:如果我创建这样一个 table,我是否尊重 BCNF Boyce-Codd 范式?

第二个可选问题[可能是开放性问题]:在这种情况下创建列 id 是好的做法吗?

  CREATE TABLE Y (
    id int,
    name varchar(20),
    PRIMARY KEY(id, name)
    );

虽然只包含两个属性的关系在 BCNF 中总是存在的,但是您的问题有点难以回答,因为文本与 table 设计不符。

如果我将您的 table 设计作为回答第一个问题的基础:您创建了一个包含两个属性 idname 的 table Y ,它们是 Y 的唯一属性,它们一起构成了唯一的键,那么它总是在 BCNF 中。

当我接受你的文字描述时,你说 name 是唯一的(就关系模型而言是一个键),那么必须考虑代理属性(或键? ) id:

一个。如果 id 也是一个键,那么 FD 是 id->name; name->id,其中 id 是一个键, name 是一个键,这样每个 FD 都有一个键 左手边。 BCNF因此应验了。

b。如果 id 本身不是关键,但 name->id 成立,那么它仍然是 在 BCNF 中(因为唯一的 FD 在他的 LHS 上有钥匙)。虽然我会 然后不明白为什么你有一个额外的属性 id 全部.

然而,最主要的是,您的数据库方案根本不遵守文本中规定的规则:带有 (id, name) 的唯一键的表达完全错误,因为您应该 id 作为主键和 name 作为唯一约束(即替代键),反之亦然。那么在BCNF中就很明显了,对应上面的选项(a)

所以不是BCNF的问题,而是"scheme correct expressed or not"的问题。

如果每一列都是唯一的,您可能想要

CREATE TABLE Y (
  id int primary key,
  name varchar(20) not null unique,
);

CREATE TABLE Y (
  id int not null unique,
  name varchar(20) not null unique
);

这里的FD是id->name和name->id。

通俗地说,当你的 FD 中的每个箭头都是来自候选键的箭头时,你就满足了 BCNF。所以这满足BCNF。

出于习惯创建代理 ID 列并不是一件好事。先想想,让自己意识到权衡和副作用。