Come si fa a normalizzare uno-a-uno-o-l'altro relazioni?
-
21-09-2019 - |
Domanda
Sono la memorizzazione dei dati sulle statistiche di baseball e vorrei farlo con tre tabelle: giocatori, battingStats e pitchingStats. Per lo scopo della domanda, ogni giocatore avrà statistiche di battuta o statistiche pitching, ma non entrambi.
Come faccio a normalizzare un tale rapporto in 3NF?
Soluzione
playerid sarebbe una chiave esterna in entrambi i BattingStats e tavoli PitchingStats
[e ricordate di mettere un po 'dimensione temporale (stagione, anno, et al) nelle tabelle statistiche]
e tra l'altro, questa è una cattiva ipotesi: per quanto ne so, brocche sono autorizzati a pipistrello, troppo
!Altri suggerimenti
Si sta davvero tenuti a non utilizzare più di 3 tavoli. Normalizzazione normalmente implica abbattere un modello non normalizzata in molte normalizzazione delle relazioni.
Se è possibile avere più di 3 tavoli, si può prendere in considerazione quanto segue (in 3NF ):
Players: ([player_id], name, date_of_birth, ...)
Batters: ([batter_id], player_id)
Pitchers: ([pitcher_id], player_id)
Batting_Stats: ([batter_id, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([pitcher_id, time_dimension], stat_1, stat_2, ...)
Attributi in []
definire la chiave primaria, ma un chiave surrogata può essere utilizzato se si preferisce . L'attributo player_id
in Batters e Piazzole dovrebbe avere un unico vincolo , e dovrebbe anche essere un < a href = "http://en.wikipedia.org/wiki/Foreign_key" rel = "nofollow noreferrer"> chiave esterna al rapporto giocatori. Batting_Stats e Pitching_Stats dovrebbero anche avere una chiave esterna rispettivamente Pastelle e Pitching.
Si noti comunque che quanto sopra non impone che un giocatore può essere solo una pastella oppure solo un lanciatore.
UPDATE:
Un metodo Sono consapevole di far valere che un giocatore è solo una pastella oppure solo una brocca, è attraverso questo modello:
Players: ([player_id], name, date_of_birth, ...)
Roles: ([role_id, role_type], player_id)
Batting_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...)
Pitching_Stats: ([role_id, role_type, time_dimension], stat_1, stat_2, ...)
Il role_type
dovrebbe definire una brocca o di una pastella. Batting_Stats e Pitching_Stats dovrebbero avere una chiave esterna composta di ruoli utilizzando (role_id, role_type)
. Un vincolo univoco sulla player_id
in ruoli garantirebbe che un giocatore può avere un solo, e solo uno, il ruolo. Infine aggiungere controllare vincoli in modo che Batting_Stats.role_type = 'Batter'
e Pitching_Stats.role_type = 'Pitcher'
. Questi garanzia vincolo di controllo che Batting_Stats è sempre descrivendo una pastella e notare una brocca. Lo stesso vale per Pitching_Stats.
Lo so come avrei implementare questo da un punto di vista pratico (mi piacerebbe creare una visualizzazione UNIONed sui tavoli disgiunti e mettere un indice univoco nella ID giocatore - di conseguenza, possono apparire solo in una tabella)
O nella tabella giocatori, registrare che tipo di statistiche che hanno, e quindi comprendono che nel rapporto FK dalle tabelle statistiche.
Ma uno di questi è probabilmente più vicino al metallo di quello che vuoi.