Учитывая таблицу, которую вы описали, у вас есть три варианта
1 - lunchmeat317
SIGNUP
-------
VolunteerId (PK)
EventId (PK)
2 - Тед Хопп
SIGNUP
-------
VolunteerId (AK1)
EventId (AK1)
3 - ic3b3rg
SIGNUP
-------
SignUpID (PK)
VolunteerId (AK1)
EventId (AK1)
Как отметил Томас, основное различие между 1 и 2 состоит в том, что Unique не останавливает следующее.
VolunteerId EventId
----------- -------
null null
null null
Однако если эти поля не позволяют начинать с нуля (а не должны), то они точно такие же.
Вы также можете добавить, поскольку ic3b3rg предлагает суррогатный ключ (SignUpID). Но, как отмечает CJ Date (и я перефразирую), введение искусственного, суррогатного, нелетучего ключа часто будет хорошей идеей, но поскольку зачастую трудно определить изменчивость, нет формального способа узнать, когда вы действительно нужно это.
Тем не менее, пока эта таблица ...
- Отслеживание того, что волонтеры подписались на мероприятия
- Не будет никаких других атрибутов, которые имеют функциональную зависимость или зависимость соединения от R (VolunteerId, EventID)
... тогда в бессмертных словах Йоги Берры " Когда вы придете к развилке дороги, возьмите его " Это означает, что все три варианта верны и выбор, вероятно, не повлияет на вашу систему так или иначе.
Лично я обычно так делаю.
SIGNUP
-------
SignUpID (PK)
VolunteerId (AK1) (Not Null)
EventId (AK1) (Not Null)