Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Mantenere l'integrità delle sottoclassi in un database relazionale

Ogni record Studente avrà una colonna Sottoclasse (supponiamo per amor di argomento che sia un CHAR(1)). {LA =Atleta, M=musicista...}

Ora crea i tuoi tavoli Atleta e Musicista. Dovrebbero anche avere una colonna Sottoclasse, ma dovrebbe esserci un vincolo di controllo che codifica il valore per il tipo di tabella che rappresentano. Ad esempio, dovresti inserire un valore predefinito di 'A' e un vincolo CHECK di 'A' per la colonna Sottoclasse sulla tabella degli atleti.

Collega i tuoi tavoli Musicista e Atleta al tavolo Studente utilizzando una chiave esterna COMPOSITA di StudentID E Sottoclasse. E hai finito! Vai a goderti una bella tazza di caffè.

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