Если ваша СУБД поддерживает их и если вы используете их правильно (и последовательно), уникальных ключей на составном ПК должно быть достаточно, чтобы избежать дублирования. По крайней мере, в SQL Server вы также можете создавать FK для уникального ключа вместо PK, что может быть полезно.
Преимущество одного столбца "id" (или суррогатного ключа) состоит в том, что он может повысить производительность, сделав более узкий ключ. Поскольку этот ключ может быть перенесен в индексы этой таблицы (в виде указателя на физическую строку из строки индекса) и в другие таблицы в виде столбца FK, это может уменьшить пространство и повысить производительность. Хотя многое зависит от конкретной архитектуры вашей RDBMS. Я не достаточно знаком с Access, чтобы комментировать это, к сожалению.
Как указывает Кассной, некоторые ORM (и другие сторонние приложения, решения ETL и т. Д.) Не способны обрабатывать составные ключи. Однако, кроме некоторых ORM, последние сторонние приложения, которые чего-либо стоят, будут поддерживать составные ключи. Однако ORM немного медленнее усваивают это.
Мое личное предпочтение для составных ключей заключается в том, что хотя уникальный индекс может решить проблему дубликатов, я еще не видел магазин разработки, который бы фактически использовал их полностью. Большинство разработчиков лень об этом. Они добавляют автоматически увеличивающийся идентификатор и двигаются дальше. Затем, через шесть месяцев, они платят мне много денег, чтобы исправить проблемы с дублирующимися данными.
Другая проблема заключается в том, что идентификаторы с автоинкрементом обычно не переносимы. Конечно, вы можете перемещать их между системами, но так как они не имеют реальной основы в реальном мире, невозможно определить одно, учитывая все остальное, относительно сущности. Это становится большой проблемой в ETL.
PK - довольно важная вещь в мире моделирования данных, и они, как правило, заслуживают большего внимания: «добавьте автоматически увеличивающийся идентификатор», если вы хотите, чтобы ваши данные были согласованными и чистыми.
Суррогатные ключи также полезны, но я предпочитаю использовать их, когда у меня есть известная проблема с производительностью, с которой я пытаюсь разобраться. В противном случае это классическая проблема - тратить время на попытки решить проблему, которой у вас может и не быть.
Последнее замечание ... в таблицах перекрестных ссылок (или в соединении таблиц, как их называют некоторые) немного глупо (на мой взгляд) добавлять суррогатный ключ, если это не требуется ORM.