Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Maintenir l'intégrité des sous-classes dans une base de données relationnelle

Chaque enregistrement Étudiant aura une colonne Sous-Classe (supposons, pour les besoins de l'argument, qu'il s'agit d'un CHAR(1)). {A =Athlète, M=musicien...}

Créez maintenant vos tableaux Athlète et Musicien. Ils doivent également avoir une colonne SubClass, mais il doit y avoir une contrainte de vérification codant en dur la valeur pour le type de table qu'ils représentent. Par exemple, vous devez mettre une valeur par défaut de 'A' et une contrainte CHECK de 'A' pour la colonne SubClass sur la table Athlete.

Liez vos tables Musician et Athlete à la table Student à l'aide d'une clé étrangère COMPOSITE de StudentID AND Subclass. Et tu as fini! Allez déguster une bonne tasse de café.

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