Как смоделировать иерархию таблиц - PullRequest
1 голос
/ 08 января 2011

Я пытаюсь подать заявку на формулу 1. У меня есть три таблицы: Team, Driver и Race Results.Я думаю о трех вариантах (и, возможно, мне не хватает больше):

Есть производная таблица Driver_Team.Иметь Driver_TeamId в этой таблице.Используйте этот Driver_TeamId в таблице результатов гонки.Похоже, это решает большинство запросов, которые я собираюсь использовать, но чувствует себя неловко и нигде не видел.

Имеют Driver.DriverId и Team.TeamId в таблице результатов гонки.Это проблема невозможности добавить дополнительную информацию.Я пока не знаю, какую информацию, может быть, дату начала присоединения к новой команде.Тогда мне понадобится таблица соединений (поскольку эта информация не связана с результатами гонки).

Последнее: иметь таблицу соединений Driver_Team, но в таблице результатов гонки можно использовать только Driver.DriverId в качестве внешнего ключа.Проблема в том, что такие запросы, как «Сколько очков команда x получила в сезоне y / несколько сезонов», действительно ужасны.

Не хватает другого решения?Если да, пожалуйста, скажите мне!:-) В противном случае, какое из этих решений кажется лучшим?

Спасибо!

Ответы [ 5 ]

0 голосов
/ 08 января 2011

Если вы сохраняете DriverId и TeamId только в таблице RaceResults, вы не можете связать драйвер с командой без RaceResult.

0 голосов
/ 08 января 2011

Для запросов, о которых вы говорите, я думаю, что DriverId и TeamId должны быть в RaceResults. Если вы хотите сохранить дополнительную информацию об ассоциации между гонщиком и командой, ее следует поместить в отдельную таблицу. Похоже, это создает некоторую избыточность, поскольку пара гонщик / команда в таблице гонки будет ограничена датами занятости в таблице DriverTeam, но, учитывая сложности контрактов и графиков, я думаю, что это может оказаться не особенно избыточный.

Мне нравится, как вы планируете БД для поддержки ваших запросов. За долгие годы я слишком много думал об ООП при разработке БД!

0 голосов
/ 08 января 2011

Я предлагаю следующее:

RaceResult - Driver - DriverTeam - Team

Где RaceResult содержит race_date, DriverTeam содержит (driver_id, team_id, team_join_date и team_leave_date).Тогда вы сможете получить всю информацию, о которой вы спрашиваете, в вашем вопросе, даже если запросы могут быть сложными.

0 голосов
/ 08 января 2011

Просто мозговой штурм, одна объектная модель может выглядеть следующим образом. Обратите внимание на заметное отсутствие поля «id» в RaceResult, поскольку конечная позиция действует как естественный ключ (один водитель на конечную позицию). Конечно, может быть много других вариантов.

Team:
  id
  name

Driver:
  id
  name
  team_id

Race:
  id
  venue
  date

RaceResults:
  position
  driver_id
  race_id
0 голосов
/ 08 января 2011

Ваш первый вариант получает мой голос. Я бы также предложил добавить таблицу Race (для хранения таких данных, как трек, дата, условия и т. Д.) И сделать Race_Results комбинацией Driver_Team и Race.

alt text

...