【发布时间】:2011-01-29 13:03:26
【问题描述】:
我正在构建一个必须在 MySQL、PostgreSQL 和 SQLite 上运行的数据库。我的一张表有一个两列的主键:
CREATE TABLE tournament (
state CHAR(2) NOT NULL,
year INT NOT NULL,
etc...,
PRIMARY KEY(state, year)
);
我想从另一个表中引用tournament 表,但我希望这个引用可为空。我可能会这样做,假设获胜者不一定有锦标赛:
CREATE TABLE winner (
name VARCHAR NOT NULL,
state CHAR(2) NULL,
year INT NULL
);
如果state 为空但year 不为空,反之亦然,则该表将不一致。我相信以下FOREIGN KEY 约束可以解决它:
ALTER TABLE winner ADD CONSTRAINT FOREIGN KEY fk (name, state) REFERENCES tournament (name, state);
这是强制执行一致性的正确方法吗?此架构是否正确规范化?
【问题讨论】:
-
为什么要让 state 和 year 可以为空?在非指定锦标赛中获胜意味着什么?
-
实际的模式更复杂,但它是有道理的。它实际上是一个词,可能会或可能不会链接到定义表,这取决于是否知道正确的定义。
标签: sql schema primary-key