Как мне нормализовать этот дизайн базы данных?
Я создаю систему отчетности и статистики по гребле для клиента, где у меня есть структура, похожая на следующую:
-----------------------------------------------------------------------------
| 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
Позиция
Время
- если вы хотите предопределенные команды:
CoachTeamLink (ссылка между Coachs
а также Teams
)
TeamID
CoachID
RowerTeamLink (ссылка между Rowers
а также Teams
)
TeamID
RowerID
EventTeamLink (ссылка между Events
а также Teams
)
TeamID
EventID
- Или, если вы не
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. Возможно, если бы я знал о гребле, это имело бы больше смысла.