¿Qué alternativa elegir para el rediseño de una base de datos (estadísticas deportivas, competiciones, ámbitos geográficos)? [cerrado]

Estoy ampliando una base de datos, que trata sobre estadísticas deportivas. Las diferentes ligas, o más precisamente "competiciones", se pueden representar mediante una estructura de árbol análoga a determinadas áreas geográficas (alcance / rango de equipos participantes):

 1. Competencia de continente (continente) ↑ 2. Competencia de país (país) ↑ 3. Competencia de región (región) ↑ 4. Competencia estatal (estado) ↑ 5. Competencia de distrito (distrito)

(Las flechas representan los FK de la entidad de área geográfica principal (estructura de árbol)).

Aquí 'el diseño visualmente:

XHTML válido
(fuente: kawoolutions.com)

Creé una jerarquía de "áreas geográficas" básicamente solo para implementar la jerarquía de competencias con alcance. Cada entidad de competencia tiene una referencia a un área geográfica, por ejemplo, cada estado conoce su región (sub-país) (parent_id).

Cada combinación de área geográfica y competencia contiene tres piezas de información: tipo de competencia (liga, copa, playoffs, ...), tipo de área geográfica (¡el alcance de los equipos participantes!) Y nombre del área geográfica.

Estas son las competencias que quería insertar en la base de datos:

INSERT INTO Competitions (geo_area_id, type, label) VALUES ( 88, 'league', 'Deutsche Meisterschaft');         -- 'Country Championships Germany'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (248, 'league', 'Regionalmeisterschaft Nord');     -- 'Region Championships North'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (249, 'league', 'Regionalmeisterschaft West');     -- 'Region Championships West'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (250, 'league', 'Regionalmeisterschaft Sued');     -- 'Region Championships South'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (251, 'league', 'Regionalmeisterschaft Ost');      -- 'Region Championships East'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (258, 'league', 'Landesmeisterschaft Hessen');     -- 'State Championships Hesse'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (268, 'league', 'Bezirksmeisterschaft Darmstadt'); -- 'District Championships Darmstadt'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (269, 'league', 'Bezirksmeisterschaft Frankfurt'); -- 'District Championships Frankfurt'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (270, 'league', 'Bezirksmeisterschaft Giessen');   -- 'District Championships Giessen'
INSERT INTO Competitions (geo_area_id, type, label) VALUES (271, 'league', 'Bezirksmeisterschaft Kassel');    -- 'District Championships Kassel'

INSERT INTO Competitions (geo_area_id, type, label) VALUES ( 88, 'cup', 'DBB Pokal');              -- 'Country Cup Germany'
-- INSERT INTO Competitions (geo_area_id, type, label) VALUES (250, 'cup', 'Regionenpokal Süd');      -- 'Region Cup South' => DOESN'T EXIST IN REALITY!
INSERT INTO Competitions (geo_area_id, type, label) VALUES (258, 'cup', 'Landespokal Hessen');     -- 'State Cup Hessen'  => PROBLEM HERE! parent should be country cup Germany, but it points to Region South due to the geo areas nature
INSERT INTO Competitions (geo_area_id, type, label) VALUES (268, 'cup', 'Bezirkspokal Darmstadt'); -- 'District Cup Darmstadt'

Para las competiciones de temporada regular (ligas) esto funciona bastante bien (entidades principales), sin embargo, en la penúltima inserción en la tabla de Competiciones me di cuenta de un problema que no había previsto:

Hay competiciones para las que no existe la "competición principal", según lo determine el padre del área geográfica. Ejemplo: los equipos clasificados de la competición de la copa de Alemania para cada estado van directamente a nivel de país, porque no existe una competición de "copa regional alemana".

Por su lógica, mirando las áreas geográficas aisladas de las competencias, las áreas geográficas en sí mismas están representadas correctamente, diría yo. Es solo que las competencias a veces parecen "saltarse" áreas geográficas. Nada irresoluble, por supuesto, pero ¿cómo me adapto mejor a esta situación ahora?

Las alternativas que me vienen a la mente:

  1. Participa en una competencia de copa ficticia para cada región. La tabla de Competiciones necesita una columna BOOLEAN is_dummy o similar. En el tiempo de ejecución, esta bandera tenía que verificarse y, si es una simulación, se devuelve el padre del área geográfica (posible de forma recursiva hasta que se encuentre un área geográfica o se devuelva NULL).
  2. Agregue otro parent_geo_area_id opcional a Competiciones. En tiempo de ejecución, este campo está marcado: si no tiene un valor NULO, utilícelo para devolver el área geográfica principal (campo de anulación principal), si no, utilice la referencia del área geográfica "normal". El problema con este enfoque es que la tabla de Competiciones ya tiene una clave externa para GeoAreas y que agregar otra representaría básicamente una "columna repetida", ¿no es así? ¿No causaría esto una unión condicional más adelante? ¿Es posible?

Ambos agregan redundancia hasta cierto punto, pero no estoy seguro de cómo hacerlo ya que el "problema de omisión de competencias" en sí mismo lo causa.

¿Quizás existan otras alternativas? Si no es así, ¿qué alternativa sugeriría y por qué?

¡Gracias!

preguntado el 16 de mayo de 11 a las 17:05

1 Respuestas

Es solo que las competencias a veces parecen "saltarse" áreas geográficas. Nada irresoluble, por supuesto, pero ¿cómo me adapto mejor a esta situación ahora?

Modele la forma en que funciona el mundo real.

No adapte un modelo que ya sabe que no funciona.

contestado el 17 de mayo de 11 a las 11:05

Las áreas geográficas simplemente se modelan de la forma en que es el mundo real: la jerarquía de las regiones Distrito -> Estado -> Región -> País es la definida por el deporte utilizado. Para su referencia, consulte: basketball-bund.com Allí puede ver las áreas geográficas visualmente (sin los distritos). Luego, como se describe, algunas competiciones van de la derecha a la zona geográfica superior izquierda en lugar de la inferior izquierda. La parte inferior izquierda taza de las competiciones no existen. Eso es lo que necesito modelar. La naturaleza de sólo algunos los concursos "agregan" esta "función de omisión". Las áreas geográficas en sí mismas se definieron hace años y representan el mundo real. - Kawu

Entiendo que modelaste áreas geográficas tal como son en el mundo real. Pero no modelaste las competiciones de esa manera. Cada vez que se encuentre considerando filas ficticias o números de identificación de padres opcionales, es una señal de que su modelo es simplemente incorrecto. Las ligas del mundo real no tienen competencias ficticias. Quizás hayas modelado una jerarquía de competencias que realmente no existe. - Mike Sherrill 'Cat Recall'

Su comentario sugiere que debería usar un padre de Competencias y eliminar el padre de GeoAreas por completo, ya que las áreas geográficas solo se crearon para formar una jerarquía geográfica de competencias. Tengo que pensar en esto. Es dificil. - Kawu

Elegí la siguiente solución bastante ingeniosa: conservé el PK de dos columnas y agregué un FK principal a la tabla de Competiciones. Por lo general, obtendría otras dos columnas, sin embargo, en mi caso, las jerarquías de competencia nunca pueden escapar de su tipo. Esto hizo que otra columna de tipo fuera redundante, simplemente siempre puedo usar la de la entidad secundaria actual. Por lo tanto, el FK principal consistirá en (parent_geo_area_id, type) y solo se agregó una columna a pesar de que la tabla tiene un PK de varias columnas. - Kawu

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.