前言
在纯关系数据库理论中,没有什么可以阻止您拥有复合主键 (PK),并且您可以拥有引用它们的外键 (FK),并且这些 FK 也必然是复合的。有些软件在组合键方面有困难,所以你经常会发现人们添加了一个 ID 列,其中包含一个自动生成的数字,然后将其指定为表的 PK。然后,其他表可以具有引用(简单)ID 列的(简单)FK。一个不常见的错误是忘记原始复合 PK 仍然是候选键 (CK),它的唯一性应该由 DBMS 通过对表的唯一约束来强制执行;它成为备用密钥(AK)。
导流
CKs、AKs 和 PKs 的系统是这样工作的:
- 每个 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_number
中的每一个都是候选键。对于化学来说,作为主键最方便;对于物理来说,最方便的。与同位素等相关的表格引用了该列,但与化学化合物相关的表格引用了该列。这里的三个CK都很简单;另一方面,同位素表有一个由元素的原子序数(质子数)和中子数组成的化合物PK。symbol
name
symbol
atomic_number
atomic_number
symbol
回答
回到你的问题,你的数据很可能是 3NF,或者更有可能是 BCNF(正式比 3NF 更强)。
在我们评估您的设计之前,您必须向我们展示您的表模式并指定适用于列的约束(功能依赖等)。但是,您所描述的任何东西都没有先验地阻止它被很好地规范化。