2009-08-07 1 views
3

Ich weiß, wie man eine zu viele, viele zu viele Beziehungen in SQL Server erstellen, aber ist es möglich, eins zu eins Beziehung zu erstellen? Und ist es möglich, 1 zu 0 oder 1 Beziehung zu erstellen?Beziehungen in Sql

Antwort

3

Ja, setzten nur PRIMARY KEY s beiden Entitäten in eine Verknüpfungstabelle, ein UNIQUE Schlüssel auf beiden Entitäten zu definieren:

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

Wenn also entityA = 1-entityB = 2 verwendet ist:

entityA entityB 
     1  2 

, Sie können weder entityA = 1 mit einer anderen entityB, noch eine entityB = 2 an eine andere entityA beziehen.

Wenn Relation symmetrischen (dh entityA und entityB gehören zu derselben Domäne und in Bezug entityA zu entityB bedeutet auch entityB zu entityA beziehen), definieren dann einen zusätzlichen CHECK constrant:

entityA entityB 

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

und transformieren die normalisierte Beziehung zu einer kanonischen mit dieser Abfrage:

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

Dies ist eine (0-1):(0-1) Beziehung.

Wenn Sie es ein 1:1 Beziehung sein wollen, definieren Sie diese Tabelle eine Domäne für beide entityA und entityB sein:

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)) 

Durch das Entfernen der FOREIGN KEY entweder aus Tabelle Definition, können Sie den entsprechenden Teil der Änderung Beziehung von 1 zu (0-1).

+0

was ist mit 1 zu 0 oder 1 Beziehung? –

0

Ja, machen Sie einfach den Primär- oder Alternativschlüssel in der abhängigen Tabelle einen Fremdschlüssel zum Primärschlüssel in der Elterntabelle.

+0

was ist mit 1 zu 0 oder 1 Beziehung? –

+0

Was ich beschrieben habe, ist eine 1 zu 0 oder 1 Beziehung. Es muss kein Datensatz in der Kindtabelle für jede Zeile in der Elterntabelle sein ... –

0

Ja

TableA id PK

TableB id PK FK TableA

+0

Was ist mit Modifizieren? Zum Beispiel Zimmer bezieht sich 1: 1 auf Manager, einige Manager wurde gefeuert, wie aktualisiert? – Dewfy

+0

auch vergessen Sie einzigartige Einschränkung – Dewfy

+0

Um es zu verwalten, müssen Sie entweder db Ebene oder auf Ihrem Datenzugriff Layer Ebene kaskadieren. – Ray

0

Es macht Spaß, aber es ist meine Lieblings Fragen zu Interview.

So haben Sie Tabelle A, B, die jeder von ihnen hat Primärschlüssel A_ID, B_ID. Fügen Sie einen beliebigen Fremdschlüssel hinzu. Lass es B: A_REF sein, also musst du nur eine eindeutige Einschränkung auf A_REF hinzufügen.

+0

+1, weil du recht hast, aber kannst du etwas ausführlicher erklären? – edebill

+0

was ist mit 1 zu 0 oder 1 Beziehung? –

+0

Tabelle A ID ist eine PK (die es automatisch einzigartig macht) und ist eine FK zu Tabelle B ID, die auch eine PK ist (die es automatisch einzigartig macht). – Ray

1

Zwei Möglichkeiten: 1) eine pk-pk 1: 1 Beziehung. Tabelle A und B haben beide eine PK. Erstelle ein FK von dem B-PK an die PK von A. Diese 'B' die FK Seite der 1 macht: 1-Beziehung:

oder

2) einen FK/UC-PK 1 1 Beziehung. Tabelle A hat eine PK und Tabelle B hat einen Fremdschlüssel zu A, aber FK in B befindet sich nicht auf der PK von B. Erstellen Sie jetzt eine UC auf dem FK-Feld (den FK-Feldern) in B.

+0

was ist mit 1 zu 0 oder 1 Beziehung? –

+0

Wie fügen Sie in Methode 1 einen neuen Eintrag in A und B ein? Und ist Methode 2 letztlich keine "1 zu 0 oder 1" Beziehung? –

+0

@ArsenMkrt: Machen Sie den FK Nullwert. @ Jonathan: Methode 1 ist einfach zu einfügen. Da B von A abhängt, fügen Sie zuerst die Zeile in A und dann die Zeile in B ein. A zeigt nicht auf B, B zeigt nur auf A. Methode 2 ist keine 1..0.1-Beziehung, wenn Sie machen den FK nicht nullbar, er wird nur optional, wenn die FK-Seite optional ist. –