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

Como você modela efetivamente a herança em um banco de dados?


Existem várias maneiras de modelar a herança em um banco de dados. Qual você escolhe depende de suas necessidades. Aqui estão algumas opções:

Tabela por tipo (TPT)

Cada classe tem sua própria tabela. A classe base tem todos os elementos da classe base nela, e cada classe que deriva dela tem sua própria tabela, com uma chave primária que também é uma chave estrangeira para a tabela da classe base; a classe da tabela derivada contém apenas os diferentes elementos.

Assim, por exemplo:
class Person {
    public int ID;
    public string FirstName;
    public string LastName;
}

class Employee : Person {
    public DateTime StartDate;
}

Resultaria em tabelas como:
table Person
------------
int id (PK)
string firstname
string lastname

table Employee
--------------
int id (PK, FK)
datetime startdate

Tabela por hierarquia (TPH)

Há uma única tabela que representa toda a hierarquia de herança, o que significa que várias das colunas provavelmente serão esparsas. Uma coluna discriminadora é adicionada, informando ao sistema que tipo de linha é essa.

Dadas as classes acima, você acaba com esta tabela:
table Person
------------
int id (PK)
int rowtype (0 = "Person", 1 = "Employee")
string firstname
string lastname
datetime startdate

Para todas as linhas que são tipo de linha 0 (Pessoa), a data de início sempre será nula.

Tabela por concreto (TPC)

Cada classe tem sua própria tabela totalmente formada sem referências a outras tabelas.

Dadas as classes acima, você acaba com estas tabelas:
table Person
------------
int id (PK)
string firstname
string lastname

table Employee
--------------
int id (PK)
string firstname
string lastname
datetime startdate