Какую альтернативу выбрать для редизайна базы данных (спортивная статистика, соревнования, географические рамки)? - PullRequest
1 голос
/ 16 мая 2011

Я расширяю базу данных о спортивной статистике.Различные лиги, или, точнее, «соревнования», могут быть представлены древовидной структурой, аналогичной определенным географическим областям (охват / диапазон участвующих команд):

 1. Continent Competition    (continent)
                                  ↑
 2. Country Competition       (country)
                                  ↑
 3. Region Competition        (region)
                                  ↑
 4. State Competition          (state)
                                  ↑
 5. District Competition     (district)

(стрелки показывают FK для родителясущность географической области (древовидная структура).)

Вот визуальный дизайн:

Допустимый XHTML http://www.kawoolutions.com/media/competitions-geoareas-nosubs.png

Я создал иерархию "географических областей" в основном только длявнедрить иерархию соревнований.Каждый объект соревнования имеет ссылку на географическую область, например, каждому государству известен свой регион (субстрания) (parent_id).

Каждая географическая область - комбинация соревнований содержит три элемента информации: тип соревнования (лига, кубок), плей-офф, ...), тип географической области (область действия участвующих команд!) и название географической области.

Вот соревнования, которые я хотел бы вставить в БД:

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'

Для соревнований регулярного сезона (лиги) это работает довольно хорошо (высшие лица), однако, со второй до последней вставки в таблицу соревнований я обнаружил проблему, которую я не предвидел:

Тамсоревнования, для которых «родительское соревнование» - как определено родителем геообласти - не существует.Пример: отборочные команды соревнования на кубок Германии для каждого штата переходят непосредственно на уровень страны, потому что не существует такого понятия, как соревнование «кубок Германии».

По своей логике, глядя на изолированные географические районыЯ бы сказал, что на соревнованиях сами географические районы представлены правильно.Просто соревнования иногда «пропускают» геообласти.Ничего неразрешимого, конечно, но как мне лучше приспособиться к этой ситуации сейчас?

Альтернативы, которые приходят мне в голову:

  1. Вступите в соревнование по кубку для каждого региона.В таблице «Соревнования» нужен столбец BOOLEAN is_dummy или аналогичный.Во время выполнения этот флаг должен был быть проверен, и, если это фиктивный объект, родительский объект географической области возвращается (возможно рекурсивно, пока не будет найдена географическая область или не будет возвращен NULL).
  2. Добавьте еще один дополнительный parent_geo_area_id в соревнования.Во время выполнения это поле проверяется: если оно имеет значение, отличное от NULL, используйте это поле для возврата родительской географической области (родительского поля переопределения), если нет, используйте «нормальную» родительскую ссылку на географическую область.Проблема с этим подходом состоит в том, что таблица Competitions уже имеет внешний ключ к GeoAreas и что добавление еще одного будет в основном представлять «повторяющийся столбец» - не так ли?Не приведет ли это к условному присоединению позже?Возможно ли это?

И то, и другое в определенной степени добавляет избыточность, но я не уверен, как это сделать, поскольку сама «проблема пропуска соревнований» сама по себе вызывает это.

Может бытьдругие альтернативы существуют?Если нет, какую альтернативу вы бы предложили и почему?

Спасибо!

1 Ответ

1 голос
/ 17 мая 2011

Просто соревнования иногда кажется, "пропустить" геообласти. Ничего такого неразрешимо конечно, но как мне лучше всего приспособиться к этой ситуации сейчас?

Смоделируйте, как работает реальный мир.

Не адаптируйте модель, которая, как вы уже знаете, не работает.

...