2016-09-19 2 views
0

私は3つのテーブル間の関係を構築するためにMSアクセスを使用しています。私は唯一の重要な列MSアクセス2つの外部キーを使用し、別の外部キーのサブセットのみを許可

表Cは、主キーのCKEYと2以上を持っている

AFとして表Aは、主キーのAKEY

表Bは、表AのAKEYから主キーBKEYと外部キーを持っているを一覧表示しています列ACおよびBC。

ACはakeyからの外部キーです(表A)。 BCは表Bのbkeyの外部キーです。

BCはオプションフィールドです。したがって、BCが満たされている場合は、AFがACと等しいbkeyの値のみを許可する必要があります。

この関係を構築する方法はありますか?

答えて

0

まず、スキーマ全体で属性名を統一します。 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) 
); 
関連する問題