foreign-keys - 规范化为 3NF(第三范式)时,您能否将复合键和/或外键移动到其他表

标签 foreign-keys relational-database database-normalization 3nf

我的数据库设计目前处于 3NF。问题是外键,在某些情况下是复合键。

如果与复合键/外键关联的属性不依赖于主键,您能否移动复合键和/或外键来创建其他表?

由于这个链接,我怀疑答案是肯定的:

外键是否包含在第三范式中?
最佳答案:仅仅因为它是外键并不意味着它也不能被视为主键的属性。它是一个外键的事实意味着它正在定义与另一个表的关系,因此不会违反 [...] 3NF。
-- 疯狂教授
https://answers.yahoo.com/question/index?qid=20081117095121AAXWBbX#

这让我想知道我目前的归一化阶段是否是 3NF。

最佳答案

序言

在纯关系数据库理论中,没有什么可以阻止您拥有复合主键 (PK),并且您可以拥有引用它们的外键 (FK),而这些 FK 也必然是复合的。有些软件对组合键有困难,所以你经常会发现人们添加一个 ID 列,其中包含一个自动生成的数字,然后将其指定为表的 PK。然后其他表可以具有引用(简单)ID 列的(简单)FK。一个并不少见的错误是忘记了原始复合 PK 仍然是候选键 (CK),它的唯一性应该由 DBMS 通过对表的唯一约束来强制执行;它成为备用 key (AK)。

转移

CK、AK和PK的系统是这样工作的:

  • 每个 CK 都是一组(一个或多个)列,它是表中每行数据其余部分中数据的唯一标识符。
  • 一个 CK 可以指定为 PK。
  • 其他 CK 成为 AK。

考虑这个表:

CREATE TABLE elements
(
    atomic_number   INTEGER NOT NULL PRIMARY KEY
                    CHECK (atomic_number > 0 AND atomic_number < 120),
    symbol          CHAR(3) NOT NULL UNIQUE,
    name            CHAR(20) NOT NULL UNIQUE,
    atomic_weight   DECIMAL(8,4) NOT NULL,
    period          SMALLINT NOT NULL
                    CHECK (period BETWEEN 1 AND 7),
    group           CHAR(2) NOT NULL
                    -- 'L' for Lanthanoids, 'A' for Actinoids
                    CHECK (group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
                                     '7', '8', '9', '10', '11', '12', '13',
                                     '14', '15', '16', '17', '18')),
    stable          CHAR(1) DEFAULT 'Y' NOT NULL
                    CHECK (stable IN ('Y', 'N'))
);

atomic_numbersymbolname 都是候选键。对于化学,symbol 作为主键最为方便;对于物理学,atomic_number 是最方便的。与同位素等相关的表格引用了 atomic_number 列,但与化合物相关的表格引用了 symbol 列。这里的三个CK都很简单;另一方面,同位素表有一个化合物 PK,由元素的原子序数(质子数)和中子数组成。

回答

回到你的问题,你的数据很可能是 3NF,或者更可能是 BCNF(形式上比 3NF 更强)。

在我们评估您的设计之前,您必须向我们展示您的表架构并指定适用于列的约束(功能依赖性等)。但是,您所描述的任何内容都无法先验地阻止它被很好地归一化。

关于foreign-keys - 规范化为 3NF(第三范式)时,您能否将复合键和/或外键移动到其他表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12322080/

相关文章:

join - 无损连接属性

database - 规范化数据库可以有 2 个链接表,将 2 个其他表链接到另一个表中的单个主键吗?

sql - 创建外键而不检查现有数据

mysql - 无法创建外键 MySQL Workbench

Django 将外键限制为满足特定条件的记录

mysql - SQL Row_number() 重复

amazon-web-services - 作为 AWS CDK 部署的一部分,如何进行数据库架构迁移?

database-design - 如果我们使用自动递增的身份列和 PK,则违反 3NF

mysql - 当我在两个表上执行 'select' 查询时,它会呈现表内的所有元素

php - Symfony2 Doctrine 架构更新失败