Первичный ключ - это концепция домена, которая однозначно (обязательно и достаточно) идентифицирует вашу сущность среди аналогичных сущностей. Составной (с несколькими столбцами) первичный ключ имеет смысл только тогда, когда часть ключа ссылается на конкретный экземпляр другой доменной сущности.
Допустим, у вас есть личная коллекция книг. Пока вы одни, вы можете считать их и назначать каждому номер. Номер является первичным ключом домена вашей библиотеки.
Теперь вы хотите объединить свою библиотеку с библиотекой своего соседа, но все же сможете различить, кому принадлежит книга. Домен стал шире, а первичный ключ теперь (owner, book_id).
Таким образом, создание каждого составного первичного ключа не должно быть вашей стратегией, но вы должны использовать его при необходимости.
Теперь несколько фактов о MySQL. Если вы определяете составной первичный ключ и хотите, чтобы RDBSM автоматически инкорпорировал для вас идентификаторы, вы должны знать о разнице между поведением MyISAM и InnoDB.
Допустим, нам нужна таблица с двумя полями: parent_id, child_id. И мы хотим, чтобы child_id автоматически инкремментировался.
MyISAM будет автоматически увеличиваться автоматически в записях с одинаковым parent_id, а InnoDB будет автоматически увеличиваться автоматически во всей таблице.
В MyISAM вы должны определить первичный ключ как (parent_id, child_id), а в InnoDB - как (child_id, parent_id), поскольку автоинкрементное поле должно быть самым левым компонентом первичного ключа в InnoDB.