Может ли таблица объединения «многие ко многим» иметь более двух столбцов? - PullRequest
4 голосов
/ 24 июня 2009

У меня есть несколько таблиц, которые выигрывают от таблиц «многие ко многим». Например, командный стол.

Член команды может занимать более одной «позиции» в команде, все позиции перечислены в таблице db позиций. Предыдущие позиции также сохраняются, для этого у меня есть отдельная таблица, поэтому у меня есть

  • таблица участников (с информацией о команде)
  • таблица позиций (содержащая позиции)
  • таблица member_to_positions (идентификатор члена и идентификатор позиции)
  • member_to_previous_positions (идентификатор члена и идентификатор позиции)

Все просто, но суть в том, что член команды может принадлежать многим командам. У меня уже есть справочная таблица team_to_member. Теперь возникает проблема, как связать позицию с командой? Участник, возможно, был лидером команды в одной команде, и в настоящее время является радиоканалом и сотрудником по прессе в другой команде. Как мне просто получить информацию о члене, чтобы показать его текущее положение, а также его прошлую историю, включая прошлые команды. Нужно ли мне добавлять таблицу позиций position_to и каким-либо образом ссылаться на нее, или я могу добавить команду к члену в таблицу позиций?

Это все очень запутанно, эта нормализация.

Ответы [ 6 ]

6 голосов
/ 24 июня 2009

Да, таблица соединений многие-ко-многим может иметь дополнительные атрибуты (столбцы).

Например, если есть таблица с именем PassengerFlight, которая основана на PassengerID и FlightID, может быть третий столбец, показывающий статус данного пассажира на данном рейсе. Два разных статуса могут быть «подтверждены» и «перечислены в очереди», каждый из которых имеет свою кодировку.

Кроме того, могут быть троичные отношения, отношения, в которых участвуют три объекта, а не только два. Эти таблицы будут иметь три внешних ключа, которые вместе взятые являются первичным ключом для таблицы отношений.

5 голосов
/ 24 июня 2009

Вполне допустимо иметь таблицу TeamPositionMember со столбцами

Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

А и столбец суррогатного идентификатора для первичного ключа, если хотите; в противном случае это составной первичный ключ с тремя полями. (Вам все равно понадобится ограничение уникальности.)

При таком расположении у вас может быть команда с любым набором позиций. Команда может иметь ноль или более человек на позицию. Человек может заполнить ноль или более позиций для ноля или более команд.

EDIT:

Если вам нужны даты, просто измените, как показано выше, и добавьте Start_Date к PK, чтобы один и тот же человек мог занимать одну и ту же позицию в разное время.

4 голосов
/ 24 июня 2009

Моя первая мысль:

Дайте вашей таблице «многие ко многим» таблицы / столбцы идентификаторов. Каждое отношение команды к члену теперь имеет идентификатор.

Затем создайте связывающие позиции «многие ко многим» с отношениями между членами команды.

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

Теперь все хорошо и СУХО, и кажется, что все соединения работают. Это звучит правильно для кого-то еще?

0 голосов
/ 24 июня 2009

Избавиться от member_to_previous_position таблицы. Просто используйте member_to_positions и получите следующие столбцы:

MemberToPositionID (autoincrement OK only)
MemberID
PositionID
StartDate
EndDate

Затем, чтобы найти текущие позиции, вы делаете:

select * 
from member_to_positions 
where EndDate is null
0 голосов
/ 24 июня 2009

Ваша таблица team_to_member действительно может иметь дополнительный столбец position_id, чтобы описать (или в данном случае указать) позицию, которую участник занимает в этой команде.

0 голосов
/ 24 июня 2009

Похоже, вам нужно много-много позиций для командных столов.

...