¿De verdad es necesario no utilizar más de 3 tablas. Normalization normalmente implica dividir un modelo no normalizado en muchas relaciones normalizadas.
Si usted puede tener más de 3 mesas, es posible que desee considerar lo siguiente (en 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, ...)
atributos en []
definen la clave principal, pero un surrogate key se pueden usar si se prefiere. El atributo player_id
en Batters y Pitches debería tener un unique constraint, y también debería ser un foreign key para la relación Jugadores. Batting_Stats y Pitching_Stats también deben tener una clave externa para Batters y Pitching, respectivamente.
Sin embargo, tenga en cuenta que lo anterior no obliga a que un jugador sea solo un bateador o solo un lanzador.
ACTUALIZACIÓN:
Un método que soy consciente de hacer cumplir que un jugador es más que un bateador o solamente un lanzador, es a través de este modelo:
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, ...)
El role_type
debe definir un lanzador o un bateador. Batting_Stats y Pitching_Stats deben tener una clave foránea compuesta para Roles usando (role_id, role_type)
. Una restricción única en player_id
en Roles aseguraría que un jugador solo tenga un rol y solo uno. Finalmente agregue check constraints de modo que Batting_Stats.role_type = 'Batter'
y Pitching_Stats.role_type = 'Pitcher'
. Esta restricción de verificación garantiza que Batting_Stats siempre describa un bateador, y tenga en cuenta a un lanzador. Lo mismo aplica para Pitching_Stats.
Ya tiene su solución. Use tres tablas como se describe en su pregunta, con las claves descritas por Steven A. Lowe, a continuación. Es posible que tenga más problemas de normalización _inside_ sus tablas de estadísticas, pero ha modelado correctamente la relación entre los jugadores y las estadísticas. –
@Steven, estoy de acuerdo en que los lanzadores batean (en la Liga Nacional y en el juego de interligas), pero esto es para una herramienta de béisbol de fantasía y las estadísticas de bateo de los lanzadores no cuentan. –