Regularmente juego un juego de 2 contra 2 con 12 amigos y quiero una base de datos para hacer un seguimiento de los jugadores, equipos, puntajes y juegos, con la intención de crear un sistema de clasificación.
Ya que regularmente cambiar de equipo que he llegado con mesas players
, teams
y games
donde los juegos tienen dos equipos (team1 y Team2) y los equipos están formados por dos jugadores (player1 y Player2).
Esto causa bastantes problemas: por ejemplo, si elijo a dos jugadores (llamémoslos A y B ) para jugar juntos, tengo que verificar si ya existe un equipo donde el Jugador1 es A y el Jugador2 es B o el Jugador1 es B y el Jugador2 es un.
Las columnas games
y wins
están presentes tanto en la players
mesa como en la teams
mesa, pero esto se debe a que quiero ver cuántos juegos ganan los jugadores, pero también qué tan compatible es el jugador en diferentes equipos (con qué frecuencia un jugador gana cuando se asocia con otro jugador específico).
- Cuadro de indicadores de clasificación (probablemente usaré el sistema de calificación Elo )
- Una página de estadísticas para cada jugador con clasificación, victorias, juegos, estadísticas de juegos recientes y con qué jugadores es más compatible.
Sospecho firmemente que gran parte de esto viola algunos de los principios en la normalización de la base de datos, y me encantaría algunas sugerencias sobre cómo implementar el diseño de mi base de datos.
fuente
Respuestas:
Hay dos problemas que veo con su esquema actual, uno es la cuestión de tener que verificar dos campos en una tabla para determinar si una clave compuesta es efectivamente un duplicado y algunos datos agregados se acumulan en las tablas individuales para separarlos. entidades (gana, especialmente, pero también potencialmente la calificación de un jugador).
Para el primer problema, no hay trucos en la base de datos para que cualquiera de los campos de una clave compuesta se trate de la manera OR que está buscando, pero si su base de datos lo admite, puede crear una función
getPlayerTeams(player_id)
para encapsular la consulta.(También puede crear una vista con la huella del equipo calculada como un hash de los identificadores de jugador ordenados, de modo que cualquier combinación de las mismas dos personas siempre dé como resultado la misma huella digital, pero eso podría ser un poco demasiado aquí).
En cuanto a la normalización, considere separar las entidades de los resultados que ocurren usando una
team_result
tabla para rastrear todos los resultados de un equipo determinado. Una normalización un poco más extrema también requeriría unaplayer_rating_hist
mesa, que contenga todos los cambios de calificación para un jugador. Su calificación actual es simplemente la que tiene la fecha más reciente. Una vista de jugador también podría usarse para contener el valor más reciente para una consulta fácil.Esquema propuesto (lo siento, no hay diagrama):
Consultas:
Esta estructura permite separar las entidades "base" (jugadores y equipos) del "contenido" que se produce como resultado de la ejecución del sistema a lo largo del tiempo, y significa que no está actualizando constantemente una de las tablas base con la calificación actual, # de ganancias, etc. Esos son valores derivados y deben recuperarse obteniendo la calificación más reciente, la calificación promedio,
COUNT
de ganancias o pérdidas, etc. Si el sistema se hizo lo suficientemente grande, podría considerar extraer dichos datos agregados en un "almacén" separado (incluso si se tratara de un conjunto separado de tablas en el mismo DB) para facilitar el análisis.fuente