まず、スキーマ全体で属性名を統一します。 akey
の名前は、使用されるテーブルに基づいて変更しないでください。代わりに、使用されるすべてのテーブルで名前akey
を使用してください。
第2に、「オプションの」列は使用しないでください.SQL NULLはすべての価値がありません。私の提案する別の方法は、オプションの関係のために第4のテーブル(第2のC
テーブル)を使用することです。つまり、(ckey, akey)
の値があり、(ckey, bkey)
の値がない場合、C
には行を挿入し、C2
には何も挿入しません。
上記の2つの常識的な提案に従えば、スキーマはかなり簡単になります(はい、列は繰り返されますが、制約を強制する必要があるため、冗長ではありません。 VIEW
):
CREATE TABLE A
(
akey INT NOT NULL UNIQUE
);
CREATE TABLE B
(
bkey INT NOT NULL UNIQUE,
akey INT NOT NULL REFERENCES A (akey),
UNIQUE (bkey, akey)
);
CREATE TABLE C
(
ckey INT NOT NULL UNIQUE,
akey INT NOT NULL REFERENCES A (akey),
UNIQUE (ckey, akey)
);
CREATE TABLE C2
(
ckey INT NOT NULL,
akey INT NOT NULL,
FOREIGN KEY (ckey, akey) REFERENCES C (ckey, akey),
bkey INT NOT NULL,
FOREIGN KEY (bkey, akey) REFERENCES B (bkey, akey),
UNIQUE (ckey, akey, bkey)
);