Oracle
 sql >> Database >  >> RDS >> Oracle

Ereditarietà nella progettazione di database

In realtà il progetto che hai descritto (tabella comune più tabelle specifiche del sottotipo) si chiama Ereditarietà tabella classi .

Ereditarietà della tavola di cemento avresti tutti gli attributi comuni duplicati nelle tabelle dei sottotipi e non avresti alcuna tabella dei supertipi come fai ora.

Sono fortemente contrario a EAV. Lo considero un antipattern SQL. Può sembrare una soluzione elegante perché richiede meno tavoli, ma ti stai preparando per un sacco di mal di testa in seguito. Hai individuato un paio di svantaggi, ma ce ne sono molti altri. IMHO, EAV viene utilizzato in modo appropriato solo se assolutamente non devi crea una nuova tabella quando introduci un nuovo sottotipo, o se hai un numero illimitato di sottotipi (es. gli utenti possono definire nuovi attributi ad hoc).

Hai molti sottotipi, ma ancora un numero limitato, quindi se dovessi fare questo progetto rimarrei con Ereditarietà tabella classi . Potresti avere poche righe di ogni sottotipo, ma almeno hai la certezza che tutte le righe in ogni sottotipo hanno le stesse colonne, puoi usare NOT NULL se necessario, puoi utilizzare i tipi di dati SQL, puoi utilizzare i vincoli di integrità referenziale, ecc. Da una prospettiva relazionale, è un design migliore di EAV.

Un'altra opzione che non hai menzionato si chiama LOB serializzato . Ovvero, aggiungi una colonna BLOB per una raccolta semistrutturata di attributi personalizzati. Archivia XML, YAML, JSON o il tuo DSL in quella colonna. Non sarai in grado di analizzare i singoli attributi da quel BLOB facilmente con SQL, dovrai recuperare l'intero BLOB nella tua applicazione ed estrarre i singoli attributi nel codice. Quindi per certi versi è meno conveniente. Ma se ciò soddisfa il tuo utilizzo dei dati, non c'è niente di sbagliato in questo.