Как мне нормализовать этот дизайн базы данных?

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

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

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

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

Обновить

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

5 ответов

Решение

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

Команды

TeamID

Тренеры

CoachID

Гребцы

RowerID

События

EventID TeamID RowerID

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

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

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

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

команда
TeamID
Название команды

Тренер
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

Я хотел бы иметь следующие таблицы:

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

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

Событие: ID, TeamID, CoachID, RowerID, EventName, позиция, время

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

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

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

команды
  Я бы
  название


гребцы
  Я бы
  название
  team_id ССЫЛКИ КОМАНДЫ (id)

тренеры
  Я бы
  название
  team_id ССЫЛКИ команды (id)

События
  Я бы
  название
  время начала
  длина

event_teams
  event_id ссылается на события (id)
  team_id ссылки на команды (id)
  позиция

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

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

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

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

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

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

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

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

Другие вопросы по тегам