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

Come si modella efficacemente l'ereditarietà in un database?

Esistono diversi modi per modellare l'ereditarietà in un database. Quale scegli dipende dalle tue esigenze. Ecco alcune opzioni:

Tabella per tipo (TPT)

Ogni classe ha la sua tabella. La classe base contiene tutti gli elementi della classe base e ogni classe che ne deriva ha la propria tabella, con una chiave primaria che è anche una chiave esterna alla tabella della classe base; la classe della tabella derivata contiene solo i diversi elementi.

Quindi ad esempio:

class Person {
    public int ID;
    public string FirstName;
    public string LastName;
}

class Employee : Person {
    public DateTime StartDate;
}

Risulterebbe in tabelle come:

table Person
------------
int id (PK)
string firstname
string lastname

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

Tabella per gerarchia (TPH)

Esiste un'unica tabella che rappresenta tutta la gerarchia dell'ereditarietà, il che significa che molte delle colonne saranno probabilmente sparse. Viene aggiunta una colonna discriminatore che dice al sistema di che tipo di riga si tratta.

Date le classi sopra, ti ritroverai con questa tabella:

table Person
------------
int id (PK)
int rowtype (0 = "Person", 1 = "Employee")
string firstname
string lastname
datetime startdate

Per tutte le righe con tipo di riga 0 (Persona), la data di inizio sarà sempre nulla.

Tabella per calcestruzzo (TPC)

Ogni classe ha la propria tabella completamente formata senza riferimenti ad altre tabelle.

Date le classi di cui sopra, ti ritroverai con queste tabelle:

table Person
------------
int id (PK)
string firstname
string lastname

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