【问题标题】:sql database: table with 2 column (id name) and 2 primary key Third Normal Form Boyce-Codd Normal Formsql 数据库:具有 2 列(id 名称)和 2 个主键的表 第三范式 Boyce-Codd 范式
【发布时间】:2017-01-03 12:20:20
【问题描述】:

想象一下下表。就我而言,我完全确定 name 必须是 uniquenot null [唯一+非 null = 主键]。因此name 是主键。由于某些原因(可能是习惯),我自然而然地创建了一个 int 类型的主键 id 列。

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

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

第二个可选问题[可能是开放式问题]:在这种情况下创建列id 是一种好习惯吗?

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

【问题讨论】:

  • nameid 都是候选键。只能选择其中一个作为主键。要违反 BCNF,您至少需要三列(假设它有一个 PK)。
  • 唯一 + 非空 = 候选键
  • @MikeSherrill'CatRecall' 是的,你是对的。这是我的错。我应该说 unique + not null = 候选键
  • @joop 是的,你是对的。这是我的错。我应该说唯一+非空=候选键。好的,所以我只需要选择一个主键。

标签: sql primary-key bcnf third-normal-form


【解决方案1】:

如果每一列都是唯一的,您可能需要任何一个

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列不是一件好事。先想想,让自己意识到权衡和副作用。

【讨论】:

    【解决方案2】:

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

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

    当我接受您的文字描述时,您声明name 是唯一的(就关系模型而言,键),那么人们必须考虑代理属性(或键?)id 的含义:

    一个。如果id 也是一个键,那么 FD 就是id->name; name->id,其中id 是一个密钥,name 是一个密钥,这样每个 FD 都有一个密钥 左手边。因此,BCNF 得到满足。

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

    然而,主要的是,您的数据库方案根本不遵守文中所述的规则:带有(id, name) 的唯一键完全错误表达,因为您应该将id 作为主键,而@ 987654336@ 作为唯一约束(即替代键),反之亦然。那么它显然在 BCNF 中,并且对应于上面提到的选项(a)。

    所以这不是BCNF与否的问题,而是“方案表达正确与否”的问题。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多