Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Unterklassenintegrität in einer relationalen Datenbank aufrechterhalten

Jeder Student-Datensatz hat eine SubClass-Spalte (nehmen Sie aus Gründen der Argumentation an, dass es sich um ein CHAR(1) handelt). {A =Athlet, M=Musiker...}

Erstellen Sie jetzt Ihre Athleten- und Musikertabellen. Sie sollten auch eine SubClass-Spalte haben, aber es sollte eine Check-Einschränkung geben, die den Wert für den Tabellentyp fest codiert, den sie darstellen. Beispielsweise sollten Sie für die Spalte „Unterklasse“ in der Tabelle „Athlet“ einen Standardwert von „A“ und eine CHECK-Einschränkung von „A“ festlegen.

Verknüpfen Sie Ihre Musiker- und Athletentabellen mit der Student-Tabelle, indem Sie einen COMPOSITE-Fremdschlüssel von StudentID AND Subclass verwenden. Und du bist fertig! Geh und genieße eine schöne Tasse Kaffee.

CREATE TABLE Student (
    StudentID INT NOT NULL IDENTITY PRIMARY KEY,
    SubClass CHAR(1) NOT NULL,
    Name VARCHAR(200) NOT NULL,
    CONSTRAINT UQ_Student UNIQUE (StudentID, SubClass)
);

CREATE TABLE Athlete (
    StudentID INT NOT NULL PRIMARY KEY,
    SubClass CHAR(1) NOT NULL,
    Sport VARCHAR(200) NOT NULL,
    CONSTRAINT CHK_Jock CHECK (SubClass = 'A'),
    CONSTRAINT FK_Student_Athlete FOREIGN KEY (StudentID, Subclass) REFERENCES Student(StudentID, Subclass)
);

CREATE TABLE Musician (
    StudentID INT NOT NULL PRIMARY KEY,
    SubClass CHAR(1) NOT NULL,
    Instrument VARCHAR(200) NOT NULL,
    CONSTRAINT CHK_Band_Nerd CHECK (SubClass = 'M'),
    CONSTRAINT FK_Student_Musician FOREIGN KEY (StudentID, Subclass) REFERENCES Student(StudentID, Subclass)
);