первичный ключ
- должен однозначно идентифицировать строку.
- не должно содержать данных, иначе оно изменится при изменении ваших данных (что плохо)
- должно быть быстрым при сравнении операций (WHERE предложения / объединения)
В идеале вы используете искусственный (суррогатный) ключ для своих строк, лучше всего использовать числовой целочисленный тип данных (INT), потому что он компактен и быстр.
Первичный ключ должен быть составлен из минимального количества полей для выполнения условий 1.-3. Для подавляющего большинства таблиц этот минимум составляет: 1 поле.
Для таблиц отношений (или очень особых крайних случаев) оно может быть выше. Ссылка на таблицу с составным первичным ключом обременительна, поэтому составной ключ не рекомендуется для таблицы, на которую нужно ссылаться самостоятельно.
В таблицах отношений (отношения m: n) вы создаете составной ключ из первичных ключей связанных таблиц, следовательно, ваш составной ключ автоматически выполняет все три условия сверху.
Вы можете сделать первичные ключи из данных, если вы абсолютно уверены , что они будут уникальными и никогда не изменится. Так как это трудно гарантировать, я бы рекомендовал против этого.