Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Связь "многие-ко-многим"


Автор: batigoal 16.12.2006, 23:49
Маленький вопрос по проектированию.

Есть три сущности: футбольный клуб, сезон, лига. Ясно, что клуб может играть в одном сезоне только в одной лиге.

Как это спроектировать? Напрашивается следующий выверт: создание таблицы-ассоциации наподобие той, которая создается для реализации связей n-n, но с foreign keys на три таблицы. При этом, учитывая, что запрос на текущий состав лиги будет одним из наиболее популярных, хочу сделать еще и избыточную связь между клубом и лигой (current_league), в обход этой ассоциативной таблицы.

Прокомментируйте, пожалуйста. Правилен ли такой подход?
Схема прилагается.

user posted image


P.S. Хотя вопрос и общий, но, учитывая, что я использую Oracle, есть еще такой вопрос. Там существует такая сущность, как "материализованное предстваление" (materialized view). Может, оно подойдет для использования вместо моей "обходной" связи?

Автор: Rodman 17.12.2006, 20:58
Ну как бы не просто представить такую базу, но 
**************
Table Season
----------------------
IDSeason   (PK)
IDLeague   (FK)(вот тут я не совсем понял, это лига типа "высшая, первая, вторая" или "Чемпионов, кубок УЕФА, Интертото")
DateBegin
DateEnd
**************

**************
Table Club
----------------------
IDClub
NameClub
IDLeague
NameStadium
DateBirth
....
**************

**************
Table League
-----------------------
IDLeague
NameLeague
IDCountry
**************

зачем четвертая таблица???

Автор: batigoal 17.12.2006, 21:23
Цитата(Rodman @  17.12.2006,  21:58 Найти цитируемый пост)

IDLeague   (FK)(вот тут я не совсем понял, это лига типа "высшая, первая, вторая" или "Чемпионов, кубок УЕФА, Интертото")

Это, например, высшая лига, первая лига, премьер-лига и т.п. (от этой таблицы еще идет привязка к стране).
А "кубок Уефа", "Интертото", "Чемпионат английской премьер-лиги" - это другая сущность (Competition), у которой тоже есть привязка к сезону.

Rodman, понимаешь, по такой схеме невозможно отследить историю. Нельзя сказать, в какой лиге играл клуб в 2002 году.

Автор: Rodman 18.12.2006, 16:34
Тогда да..

Таблица
*********************
History
--------------------------------
Id
IdCLUB
IdLeague (Season)
YearNumber
IDResult (место, короче результат)
*********************

а ты результаты каждого матча будешь хранить где нибудь???

Автор: batigoal 18.12.2006, 18:20
Цитата(Rodman @  18.12.2006,  17:34 Найти цитируемый пост)
а ты результаты каждого матча будешь хранить где нибудь??? 

Без сомнения. Предусмотрены еще таблицы Match, Match_Event (любое событие - желтая карточка, удаление, начало матча, замена, ...), Standings (текущее положение команд в турнире), Competition (турнир).... Много всего.

Цитата(Rodman @  18.12.2006,  17:34 Найти цитируемый пост)
YearNumber

Здесь тоже есть тонкость. В разных странах сезон играется по разным системам (весна-осень, осень-весна). А чемпионат мира - вообще раз в четыре года (отборочный цикл - два года). Поэтому сезон будет иметь Start/End date и еще текстовое наименование ("2005", "2005/2006" и т.п.).

Автор: Rodman 18.12.2006, 18:36
Цитата(batigoal @  18.12.2006,  17:20 Найти цитируемый пост)
Здесь тоже есть тонкость. В разных странах сезон играется по разным системам (весна-осень, осень-весна). А чемпионат мира - вообще раз в четыре года (отборочный цикл - два года). Поэтому сезон будет иметь Start/End date и еще текстовое наименование ("2005", "2005/2006" и т.п.). 



ну это же все можно в League хранить.!?!!?!

Автор: batigoal 18.12.2006, 18:47
Цитата(Rodman @  18.12.2006,  19:36 Найти цитируемый пост)
ну это же все можно в League хранить.!?!!?! 

Ну так а кубки, например?

"Лига" - это просто группа клубов, принадлежность определенному классу команд. А вот "Чемпионат высшей лиги" - это уже соревнование, проводимое ежегодно.

В общем, если интересно, я могу просто схему целиком выложить smile

Автор: Rodman 18.12.2006, 18:54
Цитата(batigoal @  18.12.2006,  17:47 Найти цитируемый пост)
В общем, если интересно, я могу просто схему целиком выложить smile 

давай... посмотрим

Автор: Dremlin 18.12.2006, 18:56
Цитата(batigoal @  18.12.2006,  17:47 Найти цитируемый пост)

В общем, если интересно, я могу просто схему целиком выложить

угу, причем желательно (если можно) выложить схемку на Винград, а то у некоторых кроме Винграда ничего не открывается и соотв. сторонние картинки выглядят одиноково - user posted image.

Автор: batigoal 18.12.2006, 21:17
В аттаче - текущий полный вариант этого компонента схемы. Остальные компоненты будут относительно независимы, а может - и вовсе вынесены в отдельные схемы.

Будут вопросы по схеме - задавайте.

Автор: Dremlin 19.12.2006, 10:08
Задаю:
1. Каких типов Event'ы будешь хранить?
2. Чего-то я не совсем улавливаю разницу между Player и Employee...

ЗЫ. вообще-то было бы неплохо озвучить небольшой комментарий к задаче и схеме в целом.

Автор: batigoal 19.12.2006, 10:41
Цитата(Dremlin @  19.12.2006,  11:08 Найти цитируемый пост)
1. Каких типов Event'ы будешь хранить?

Сейчас на память все не назову, их я набросал дома в блокноте. Но вот примеры:

first_time_start
first_time_end
second_time_start
second_time_end
extra_first_time_start
extra_first_time_end
extra_second_time_start
extra_second_time_end
match_cancelled (имеется в виду, в середине матча - из-за погоды или инцидента)

player_entered
player_substituted
player_finished (игрок вышел из игры по окончании матча, т.е. без замены)

goal
own_goal (автогол)
yellow_card
red_card
penalty

Как нетрудно заметить, я мониторю не все события, а те, которые важны для статистики, аналогичной комментаторской документации.

Цитата(Dremlin @  19.12.2006,  11:08 Найти цитируемый пост)
2. Чего-то я не совсем улавливаю разницу между Player и Employee...

Employee может быть не только игрок, но и тренерский штаб и прочие функционеры.

Цитата(Dremlin @  19.12.2006,  11:08 Найти цитируемый пост)
ЗЫ. вообще-то было бы неплохо озвучить небольшой комментарий к задаче и схеме в целом. 

Я это в будущем обязательно сделаю, но отдельным постом (или серией постов). На этой базе (с дополнениями) я планирую сделать несколько проектов.

Автор: Dremlin 19.12.2006, 11:43
Цитата(batigoal @  19.12.2006,  09:41 Найти цитируемый пост)
Но вот примеры:

OK, а что будешь хранить в Match_Event.player_id для Event'ов типа:
Цитата(batigoal @  19.12.2006,  09:41 Найти цитируемый пост)
first_time_start
first_time_end
second_time_start

и т.д.?

Автор: batigoal 19.12.2006, 11:55
NULL  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)