Mysql
 sql >> Database >  >> RDS >> Mysql

Struttura della tabella di database SQL di tipo polimorfico

Il libro di Craig Larman "Applying UML with Patterns" descrive le 3 soluzioni comuni a questo problema.

I tuoi esempi non sono particolarmente utili:non c'è motivo logico per avere 3 modi diversi di gestire il nome di una persona nel tuo database (sebbene ciò avvenga regolarmente a causa della stranezza dell'importazione/esportazione dei dati).

Tuttavia, è molto comune che ci sia un'entità "persona" che potrebbe essere un dipendente (con employee_id), un contatto (con un collegamento alla tabella dei prospect) o un cliente (con un customer_id e un collegamento alla tabella degli ordini) .

Nel libro di Larman, dà 3 soluzioni.

Un tavolo per dominarli tutti Qui crei una singola tabella con tutte le colonne conosciute. Questo crea una tabella disordinata e spinge la responsabilità di conoscere le regole di persistenza di ogni sottoclasse al livello dell'applicazione:il database non imporrà ai clienti la necessità di avere un customer_id. Tuttavia, rende i join molto più semplici:qualsiasi tabella che deve essere collegata a una persona può semplicemente, beh, collegarsi alla tabella persona.

Tavolo Superclass Questo ripulisce le cose estraendo gli attributi comuni in un'unica tabella, ad es. "person" - e spinge i campi specifici della sottoclasse nelle tabelle delle sottoclassi. Quindi, potresti avere "person" come tabella della superclasse e tabelle "contact", "employee" e "customer" con i dati della sottoclasse specifica. Le tabelle delle sottoclassi hanno una colonna "person_id" per ricollegarsi alla tabella delle superclassi. Questo è più complesso - in genere richiede un join aggiuntivo durante il recupero dei dati - ma anche molto meno soggetto a errori - non è possibile corrompere accidentalmente il modello di dati con un bug che scrive attributi non validi per "dipendente".

Tabella per sottoclasse - questo è ciò che hai descritto. Introduce una discreta quantità di duplicazione nel modello di dati e spesso si hanno join condizionali - "unisciti sulla tabella x se tipo di persona =y", che può rendere complicato il codice di accesso ai dati.