Progettazione di database per l'ereditarietà

3

Nel mio progetto ho un oggetto Player (attr esempio: pl_id , pl_data1 ) che è uno di questi tipi:

  • La sua GoalKeeper (attr esempio: gk_data1 )
  • OR Defender (attr esempio: df_data1 )
  • OR Forward (attr esempio: fw_data1 )

Nella mappatura di questi oggetti nel database:

Opzione 1: Crea una tabella Player con colonne ( pl_id , pl_data1 , gk_data1 , df_data1 , fw_data1 )

In questa opzione abbiamo un record per ogni giocatore. Quindi se un giocatore è un portiere, la colonna gk_data1 sarà riempita e l'altra colonna ( df_data1 e fw_data1 ) sarà nullo.

Opzione 2: fai

  • Tabella Player con colonne: ( pl_id , pl_data1 , type )
  • Tabella GoalKeeper con colonne: ( pl_id , gk_data1 )
  • Tabella Defender con colonne: ( pl_id , df_data1 )
  • Tabella Forward con colonne: ( pl_id , fw_data1 )

e pl_id nelle tabelle child ( GoalKeeper , Defender e Forward ) si collega a Player.pl_id . la relazione dalle tabelle figlio al genitore è una a una e dal genitore al figlio è da uno a uno_o_zero.

domande:

  1. che è meglio?
  2. ci sono altre (e migliori) opzioni?
  3. e infine qual è la migliore pratica in questa situazione?
posta ssssss 20.10.2014 - 12:58
fonte

2 risposte

3

La scelta migliore dipende dalle specificità della situazione.

Le tue due opzioni assomigliano a due tecniche conosciute come " Eredità della tabella singola " e " Ereditarietà delle tabelle di classe ". Fare clic per visualizzare la presentazione di Martin Fowler di questi concetti.

In SO, le domande sull'ereditarietà e sul design delle tabelle sono raggruppate sotto due tag con lo stesso nome. In SE.DBA, c'è un singolo tag chiamato Sottotipi.

    
risposta data 20.10.2014 - 13:37
fonte
2

Nessuno dei precedenti

GoalKeeper, Defender e Forward sono ruoli , non sottoclassi / tipi di Player. Un giocatore può essere un Difensore in una partita e un GoalKeeper in un'altra.

In genere si avrebbe una tabella delle mappe di ruolo per assegnare i giocatori ai ruoli. È difficile dire esattamente cosa fare senza ulteriori dettagli, in particolare la differenza comportamentale e di dati tra i ruoli rispetto alla classe Player.

    
risposta data 20.10.2014 - 17:25
fonte

Leggi altre domande sui tag