Heather14637354 Ответов: 1

Как мне нормализовать это, чтобы в первичном ключе не было повторяющихся значений?


У меня есть стол, который выглядит примерно так:

ID | NAME | HOMEID | HOMENAME | TEAMID | TEAMNAME | YEARJOINED
1 | PETE | SP |   SPAIN  |     1  |   TEAM1  |  2018
2 | PAUL | FR |   FRANCE |     1  |   TEAM1  |  2018
3 | MARY | GR |  GREECE  |    2   |  TEAM2   | 2019
1 | PETE | SP |   SPAIN  |     2  |   TEAM2  |  2019
2 | PAUL | FR |  FRANCE  |    2   |  TEAM2   | 2020


Каждый человек может присоединиться максимум к одной команде в год.


Я нормализовал таблицу вплоть до (того, что я думаю) BCNF:

{ID, NAME}
{HOMEID, HOMENAME}
{TEAMID, TEAMNAME}
{ID, TEAMID, YEARJOINED}
{ID, HOMEID, TEAMID}


Однако я действительно не знаю, как нормализовать это так, чтобы в первичном ключе для последних двух таблиц не было повторяющихся значений. Насколько я могу понять, способ YEARJOINED зависит от ID и TEAMID, таблицы всегда будут иметь повторяющиеся значения?

Что я уже пробовал:

Я попробовал разделить таблицы на TEAM1 и TEAM2, т. е.:

TEAM1{ID, TEAMID, YEARJOINED}
TEAM2{ID, TEAMID, YEARJOINED}


учитывая, что каждый человек может присоединиться только к одной команде в год. Однако это затрудняет выполнение SQL-запросов к таблицам позже!

MadMyche

Можете ли вы предоставить этому еще какой-то контекст; было бы легче работать с ним, если бы была более широкая картина

1 Ответов

Рейтинг:
2

k5054

Если предположить, что дом игрока не изменится в течение его жизни, то ваши столы могут быть:
{HOMEID, HOME}
{TEAMID, КОМАНДА}
{ID, ИМЯ, HOMEID }
{ID, YEARJOINED, TEAMID}

Для последней таблицы, у вас есть ограничение, что (идентификатор, YEARJOINED) является уникальным, так что вы могли бы добавить, что в качестве ограничения таблицы, или использовать (ИД, YEARJOINED) в качестве первичного ключа соединений.


Heather14637354

Пожалуйста, простите мое невежество, но разве это не приведет к дублированию значений в первичном ключе, потому что вам все равно придется перечислять каждого человека несколько раз, если он присоединился к нескольким командам?

k5054

Ты сам так сказал "каждый человек может присоединиться только к одной команде в год" Таким образом, это означает, что вы можете использовать (ID, YEARJOINED) в качестве первичного ключа, а первичный ключ по определению уникален для данной таблицы.
Если я неправильно понял, то и игрок мочь присоединяйтесь к более чем одной команды каждый год, то вам придется добавлять созданный PK для таблицы (электронная.г к "идентичности" (в MS SQL) или "типа AUTO_INCREMENT" (СУБД MySQL), а может продлить YEARJOINED в DATEJOINED (ГГГ-ММ-ДД) или DATETIMEJOINED (гг-ММ-ДД чч:мм:СС)