Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Mantendo a integridade da subclasse em um banco de dados relacional


Cada registro de Aluno terá uma coluna de Subclasse (suponha para fins de argumento que seja um CHAR(1)). {A =Atleta, M=músico...}

Agora crie suas tabelas de Atletas e Músicos. Eles também devem ter uma coluna SubClass, mas deve haver uma restrição de verificação codificando o valor para o tipo de tabela que eles representam. Por exemplo, você deve colocar um padrão de 'A' e uma restrição CHECK de 'A' para a coluna Subclasse na tabela Atleta.

Vincule suas tabelas Musician e Athlete à tabela Student usando uma chave estrangeira COMPOSITE de StudentID AND Subclass. E pronto! Vá desfrutar de uma boa xícara 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)
);