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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top