Sei davvero obbligato a non utilizzare più di 3 tavoli. Normalization normalmente implica l'abbattimento di un modello non normalizzato in molte relazioni normalizzate.
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 []
definiscono la chiave primaria, ma un surrogate key possono essere utilizzati se si preferisce. L'attributo player_id
in Batters and Pitches deve avere un unique constraint e dovrebbe anche essere un foreign key alla relazione Players. Batting_Stats e Pitching_Stats dovrebbero avere anche una chiave esterna per Batters e Pitching rispettivamente.
Si noti tuttavia che quanto sopra non impone che un giocatore possa essere solo un battitore o 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 un lanciatore o un battitore. Batting_Stats e Pitching_Stats devono avere una chiave esterna composita per i ruoli utilizzando (role_id, role_type)
. Un vincolo univoco su player_id
in Ruoli garantirebbe che un giocatore possa avere solo un ruolo, e solo uno. Aggiungere infine check constraints in modo che Batting_Stats.role_type = 'Batter'
e Pitching_Stats.role_type = 'Pitcher'
. Questi limiti di controllo garantiscono che Batting_Stats descriva sempre un battitore e noti un lanciatore. Lo stesso vale per Pitching_Stats.
Hai già la soluzione. Usa tre tabelle come descritto nella tua domanda, con le chiavi descritte da Steven A. Lowe, sotto. Potresti avere ulteriori problemi di normalizzazione _inside_ le tue tabelle delle statistiche, ma hai modellato correttamente la relazione tra giocatori e statistiche. –
@Steven, sono d'accordo sul fatto che i lanciatori si battano (in NL e in interleague play,), ma questo è per uno stendardo da baseball fantasy e le statistiche di battuta dei lanciatori non contano. –