2016-04-20 8 views
0

ich eine grundlegende Schema habe:Wie richtig Einschränkungen in SQL erhalten

CREATE TABLE Human (
hid INTEGER PRIMARY KEY, 
name VARCHAR(50), 
gender CHAR(1), 
dob DATE 
); 
CREATE TABLE Wed (
husbd INTEGER REFERENCES Human(id), 
spouse INTEGER REFERENCES Human(id), 
wedSince DATE, 
PRIMARY KEY (husbd, spouse) 
); 

In diesem Schema kann jedes Paar genau einmal verheiratet sein ... aber ich sehe wirklich nicht, warum. Könnte jemand erklären? Wie würde ich Trennungen und Wiederverheiratungen desselben Paares zulassen?

+0

Der Primärschlüssel erlaubt keine Duplikate –

Antwort

0

Vielleicht in den Daten kann jedes Paar nur einmal verheiratet werden. Dieses Schema erzwingt diese Einschränkung jedoch nicht. Das Problem ist, dass (A, B) und (B, A) beide erlaubt sind.

Dies ist einfach genug, um durch Hinzufügen einer Check-Einschränkung für die Ehepartner zu beheben. Ich würde gehen für:

CREATE TABLE Wed (
    spouse1 INTEGER REFERENCES Human(hid), 
    spouse2 INTEGER REFERENCES Human(hid), 
    wedSince DATE, 
    PRIMARY KEY (spouse1, spouse2), 
    CHECK (spouse1 < spouse2) 
); 

Die letzte Einschränkung garantiert, was Sie wollen. Die letzte Bedingung garantiert, dass (spouse1, spouse2) und (spouse2, spouse1) nicht beide in der Tabelle sind. Beachten Sie, dass dies immer noch zulässt, dass ein Ehepartner mit mehreren anderen Menschen verheiratet ist - in den meisten Teilen der Welt würde dies eine Scheidung oder Witwenschaft bedeuten.

Als Bezugspunkt, viele Länder erkennen gleichgeschlechtliche Paare, so gibt es keine Garantie, dass einer der Ehegatten ein "Ehemann" ist.

+0

Wie wäre es mit polygamen Personen? – wildplasser

+0

@wildplasser. . . "In den meisten Teilen der Welt,...". –

Verwandte Themen