En definitiva, todo se reduce a uso y arquitectura.
Arquitectura
¿El sistema maneja "algún deporte"? ¿Es la idea de que te pongas el sombrero de astronauta de tu arquitectura y construyas un sistema genérico que pueda manejar cualquier tipo de deporte futuro que ni siquiera exista hoy?
Si es así, obviamente tener tablas con nombres dinámicos es un gran dolor, por lo que tendría sentido tener un esquema que soporte n deportes, si es necesario.
Dicho esto, tengo un sesgo muy fuerte en contra de este enfoque: esto casi siempre es más trabajo y conduce a peores resultados. Hacer una IU, un esquema, etc. por separado para cada deporte en última instancia conducirá a una mejor experiencia del usuario y un código más fácil de mantener, incluso si significa una cantidad superficial de duplicación (cómo evitar / minimizar esta es una pregunta separada).
¿Cómo manejas a los jugadores que practican múltiples deportes? ¿Reciben dos entradas (por ejemplo, las tratas como personas diferentes) o estás tratando de hacer algo específico con ellas?
Utilizar
Así que supongamos que no practicas deportes dinámicamente (por ejemplo, si alguien quiere agregar un deporte nuevo, requiere un esfuerzo de desarrollo para agregarlo).
¿Hay algún momento en el que muestres jugadores (o cualquier otro objeto que hayas mencionado) de más de un deporte a la vez?
Pude ver esto para una función de búsqueda, donde puedes buscar por nombre de jugador o equipo (independientemente del deporte), pero más allá de eso, no puedo imaginar muchos casos de uso.
Si nunca necesita hacer esto, entonces su enfoque está perfectamente bien. Puedes dejar de leer aquí.
Esquemas alternativos
Puntos de vista
Soy fan de KISS. En más de 15 años de desarrollo de software, continúo recurriendo a la filosofía "construir lo más simple que funciona".
Entonces, mi reacción inicial, suponiendo que una función de búsqueda entre deportes es realmente el único caso de uso, es crear vistas:
SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ...
UNION
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ...
UNION ....
Por supuesto, si agrega un nuevo deporte, debe agregarlo a la vista. También puede ser útil incluir otra información común, pero realmente depende de lo que se necesite mostrar.
Intentaría mantener todas las cosas específicas del deporte en la definición de Vista, para que el código de búsqueda no necesite tener mucho o ningún código específico (además de saber cómo vincular a /nhl/players/player-name
vs /nfl/...
o como su aplicación lo haga).
Herencia de mesa
La herencia de tablas puede funcionar, pero es bastante compleja. No tengo mucha experiencia con él, y de hecho, creo que cada vez que he estado involucrado en evaluarlo terminamos haciendo algo más simple (como sugiero aquí).
Entonces, personalmente, todavía tengo que encontrar por qué esto sería útil, pero tal vez haya un caso de uso convincente (que no conozco) que justifique la complejidad (por ejemplo, la herencia de tablas resuelve el caso de uso mejor que cualquier otra solución) .
Tablas separadas para atributos deportivos específicos
Podría hacer una sola players
tabla que tenga atributos comunes a todos los jugadores de todos los deportes, y luego otro conjunto de tablas como nhl_players_details
esa contiene un ID de jugador y columnas con información adicional sobre el jugador. Si hay un montón de atributos comunes, o tiene muchos usos de "todos los jugadores de todos los deportes", entonces esto puede tener sentido.
Pares de valores clave para atributos específicos del deporte
Enfoque completamente alternativa: tener una players
mesa (de nuevo, con atributos comunes como el nombre) y luego una player_data
tabla que tiene PlayerId
, Sport
, Attribute
, Value
. Los nombres de los atributos ingresados serían específicos del deporte. Esto le permite esencialmente agregar nuevos atributos sin modificar el esquema (su código aún tendría que saber cargarlos / mostrarlos, por supuesto). El inconveniente es que pierde algo de integridad: el valor normalmente sería un campo de cadena, por lo que el código de su aplicación debería ser resistente y manejar posibles fallas al convertir la cadena value
a un tipo de datos específico (como un entero).
Este concepto, por supuesto, puede aplicarse a equipos, juegos, etc.