Как мне нормализовать этот дизайн базы данных? - PullRequest
2 голосов
/ 10 августа 2009

Я создаю систему отчетности и статистики по гребле для клиента, в которой на данный момент у меня есть структура, подобная следующей:

-----------------------------------------------------------------------------
| ID | Team     | Coaches    | Rowers     | Event     | Position | Time     |
-----------------------------------------------------------------------------
| 18 | TeamName | CoachName1 | RowerName1 | EventName | 1        | 01:32:34 |
|    |          | CoachName2 | RowerName2 |           |          |          |
|    |          |            | RowerName3 |           |          |          |
|    |          |            | RowerName4 |           |          |          |
-----------------------------------------------------------------------------

Это пример строки данных, но я хотел бы расширить ее до таблицы Rowers и таблицы Coach и т. Д., Но я не знаю, как лучше связать это обратно с таблицей Entries, что и есть .

Есть ли у кого-нибудь слова мудрости, которыми они могли бы поделиться со мной?

Обновление

У команды может быть любое количество тренеров и гребцов, у гребца может быть много команд (команда A, B, C и т. Д.), А у команды может быть много тренеров.

Ответы [ 5 ]

2 голосов
/ 10 августа 2009

Я бы выбрал отдельные таблицы для команд, тренеров, гребцов (может быть, спортсменов, если есть несколько видов спорта, которые вы хотите масштабировать) и событий.

Команда

TeamID

Тренеры

CoachID

Гребцы

RowerID

События

EventID TeamID RowerID

Существует множество других вопросов, которые будут дополнительно определять отношения, например: Что определяет запись (событие)? Это один набор гребцов и один тренер на соревнование? Несколько тренеров на набор гребцов на событие? Есть ли команды? Что составляет команду?

Я бы задавал такие вопросы ...

1 голос
/ 11 августа 2009

Этакая таблица ссылок? Как мне тогда сопоставить несколько Гребцов и Тренеров в одну Команду?

Это мое предложение (на основе ответа Оптимальные решения ):

Команда
TeamID
TeamName

Coach
CoachID
CoachName

Гребной
RowerID
RowerName

Событие
EventID
Должность
Время

  1. если вы хотите предопределенные команды:

CoachTeamLink (связь между Coachs и Teams)
TeamID
CoachID

RowerTeamLink (связь между Rowers и Teams)
TeamID
RowerID

EventTeamLink (связь между Events и Teams)
TeamID
EventID

  1. Или, если нет:

EventCoachLink (связь между Events и Coachs)
EventID
CoachID

EventRowerLink (связь между Events и Rowers)
EventID
RowerID

0 голосов
/ 22 марта 2010

Я бы попробовал что-то вроде этого: *

teams
  id
  name


rowers
  id
  name
  team_id REFERENCES TEAMS (id)

coaches
  id
  name
  team_id REFERENCES teams (id)

events
  id
  name
  starting_time
  length

event_teams
  event_id references events (id)
  team_id references teams (id)
  position
0 голосов
/ 10 августа 2009

У меня были бы следующие таблицы:

Команда: ID, TeamName Coach: ID, CoachName, TeamID Гребец: ID, RowerName, TeamID

Тогда ваша таблица событий будет заполнена следующим образом:

Событие: идентификатор, TeamID, CoachID, RowerID, имя события, позиция, время

Если вы хотите отобразить ненормализованные данные в запросе, вы должны создать что-то вроде:

SELECT E.ID, T.TeamName, C.CoachName, R.RowerName, E.EventName, E.Position, E.Time
FROM Event E
INNER JOIN Team T
ON E.TeamID = T.ID
INNER JOIN Coach C
ON E.CoachID = C.ID
INNER JOIN Rower R
ON E.RowerID = R.ID
0 голосов
/ 10 августа 2009

Вы говорите, что вы опубликовали "таблицу записей", но эта таблица не имеет особого смысла, и, по крайней мере, не с точки зрения (одна строка, без каламбура) = (один факт или вещь).

Одна из строк в вашей таблице (NULL, NULL, NULL, RowerName3, NULL, NULL, NULL). Что это значит? Для чего CoachName2 тренер? И так далее.

Или, может быть, это «одна строка» вашей таблицы Entries? Если это так, то это не очень хорошая таблица SQL, потому что у вас есть списки строк (например) в одном пересечении столбцов строк, а «список строк» ​​не является хорошим выбором типа данных.

Невозможно сказать, как нормализовать базу данных, если вы посмотрите только на некоторые данные. Вам необходимо знать, что эти данные означают и представляют в бизнес-модели, которую они моделируют.

Тем не менее, мне кажется, вам нужны хотя бы отдельные таблицы для

Команды Тренеры Гребцы События

И затем вам необходимо представить аспекты бизнес-сценария, такие как «Гребец принадлежит только одной команде», «У команды есть по крайней мере один тренер, и ни один тренер не тренирует более одной команды».

Я не знаю, что такое Entry, если посмотреть на это, но, возможно, вам нужен стол для Entries. Возможно, если бы я знал о гребле, это имело бы больше смысла.

...