2009-08-07 10 views
3

私はSQL Serverの1対多、多対多の関係を作成する方法を知っていますが、1対1の関係を作成することは可能ですか? 1から0または1の関係を作成することは可能ですか?Sqlの関係

答えて

3

はい、ちょうど両方のエンティティにUNIQUEキー定義、リンクテーブルに両方のエンティティのPRIMARY KEY Sを置く:、

entityA entityB 
     1  2 

entityA = 1entityB = 2に関連している場合、このように

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB)) 

entityA = 1も他のentityBにもentityB = 2も他のいずれにも関連付けることはできません。entityA

entityA entityB 

UNIQUE(entityA) 
UNIQUE(entityB) 
CHECK(entityA < entityB) 

と変換:

あなたの関係は対称ある場合は、追加CHECK constrantを定義する(すなわちentityAentityBは、同じドメインともentityAentityBに関連する意味entityAentityBに関連に属しています)次のクエリを使用して正規化された正規化された関係:

SELECT entityA, entityB 
FROM myrel 
UNION 
SELECT entityB, entityA 
FROM myrel 

これは(0-1):(0-1)の関係です。

あなたはそれが1:1関係になりたい場合は、entityAentityB両方のドメインであることを、このテーブルを定義します。

myrel(entityA, entityB, UNIQUE(entityA), UNIQUE(entityB)) 
A(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityA)) 
B(id, PRIMARY KEY(id), FOREIGN KEY(id) REFERENCES myrel (entityB)) 

いずれかの表の定義からFOREIGN KEYを除去することにより、あなたはの対応する部分を変更します関係は1から(0-1)までです。

+0

約1〜0または1の関係は? –

0

はい、親テーブルの主キーへの外部キーは、従属テーブルの主キーまたは代替キーにするだけです。

+0

約1〜0または1の関係は? –

+0

私が説明したことは、1対0または1の関係です。親テーブルのすべての行の子テーブルにレコードがある必要はありません。 –

0

はい

TableAの のid PK

TableBの ID PK FKのTableAの

+0

変更はどうですか?例えば部屋は1:1のマネージャーに関連していますが、マネージャーの一部は解雇されました。 – Dewfy

+0

あなたはユニークな制約も忘れています – Dewfy

+0

これを管理するには、dbレベルまたはデータアクセスレイヤレベルのカスケードが必要です。 – Ray

0

それは楽しみですが、面接でそれ私のお気に入りの質問。

だから、それぞれに対応するテーブルA、Bは、主キーA_ID、B_IDを持っています。 anyに外部キーを追加します。それをB:A_REFとすると、A_REFに一意の制約を追加するだけで済みます。

+0

+1が正しいので、もう少し詳しく説明できますか? – edebill

+0

約1から0または1の関係は? –

+0

表A idはPK(自動的に一意にします)で、FK to table B idで、PK(これは自動的に一意になります)です。 – Ray

1

2つの方法: 1)pk-pk 1:1の関係。表AおよびBは両方ともPKを有する。 1関係

又は

2)FK/UC-PK 1:1の関係A.のPKにB PKからFKを作成これは 'B' 1のFK側になります。テーブルAにはPKがあり、テーブルBにはAへの外部キーがありますが、BのFKはBのPKにありません。次に、BのFKフィールドにUCを作成します。

+0

約1〜0または1の関係は? –

+0

方法1では、AとBの両方にどのように新しいエントリを挿入しますか?方法2は最終的に「1対0または1」の関係ではありませんか? –

+0

@ArsenMkrt:FKをnullにします。 @Jonathan:方法1は簡単に挿入できます。 BはAに依存するので、最初に行をAに挿入し、次にBの行を挿入します.AはBを指しておらず、BはAを指しています。方法2は1..0..1の関係ではないFKをヌル可能にしないようにします.FK側がオプションの場合はオプションになります。 –