Question

Je stocker des données sur les statistiques de baseball et je voudrais le faire avec trois tables: les joueurs, battingStats et pitchingStats. Aux fins de la question, chaque joueur aura des statistiques de frappeurs ou stats pitching, mais pas les deux.

Comment puis-je normaliser une telle relation en 3FN?

Était-ce utile?

La solution

playerId serait une clé étrangère dans les deux BattingStats et tables PitchingStats

[et ne pas oublier de mettre une dimension de temps (saison, année, et al) dans les tableaux statistiques]

et par la manière, c'est une mauvaise prise en charge: pour autant que je sache, les pichets sont autorisés à chauve-souris aussi

Autres conseils

Êtes-vous vraiment nécessaire de ne pas utiliser plus de 3 tables. implique normalement Normalization décomposer un modèle non normalisé dans de nombreuses relations normalisées.

Si vous pouvez avoir plus de 3 tables, vous pouvez considérer les points suivants ( 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, ...)

Attributs dans [] définir la clé primaire, mais peut être utilisé si l'on préfère de substitution clé . L'attribut player_id dans Batters et des terrains devrait avoir un uniques , et il devrait aussi être un < a href = "http://en.wikipedia.org/wiki/Foreign_key" rel = "nofollow noreferrer"> clé étrangère la relation des joueurs. Batting_Stats et Pitching_Stats devraient également avoir une clé étrangère à Batters et pitching respectivement.

Notez cependant que ces exigences n'impose pas qu'un joueur ne peut être qu'une pâte à frire ou seulement un lanceur.


Mise à jour:

Une méthode que je suis conscient de faire respecter qu'un joueur est seulement une pâte à frire ou seulement un lanceur, est par ce modèle:

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, ...)

Le role_type devrait définir un lanceur ou une pâte. Batting_Stats et Pitching_Stats devraient avoir une clé étrangère composite à l'aide de rôles (role_id, role_type). Une contrainte unique sur player_id dans les rôles veillerait qu'un joueur ne peut avoir qu'un seul, et un seul, le rôle. Enfin, ajoutez vérifier les contraintes pour Batting_Stats.role_type = 'Batter' et Pitching_Stats.role_type = 'Pitcher'. Ces contrainte de vérification garantie que Batting_Stats est toujours décrit une pâte, et notez un lanceur. Même pour Pitching_Stats.

Je sais comment je mettre en œuvre ce d'un point de vue pratique (je créerais une vue filles fusionnées sur les tables disjoints et mettre un index unique sur l'ID du joueur - par conséquent, ils ne peuvent apparaître que dans un seul tableau)

Ou dans le tableau des joueurs, fiche quel type de statistiques qu'ils ont, et comprennent que dans la relation FK des tableaux statistiques.

Mais l'une de ces est probablement plus proche du métal que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top