Простой ответ: если ваша таблица Localization
выглядит следующим образом:
LocalizationID - / compound primary key
LanguageID - \ compound primary key (FK to Languages.LanguageID)
Data - string (for example 'My Program' in English)
и вы хотите добавить внешний ключ в другую таблицу, ссылающуюся на эту таблицу, этот внешний ключ должен иметь оба столбца вашего PK здесь под рукой, поэтому это может быть:
Таблица 'UserLocalization'
UserLocalizationID - primary key
UserID - which user (FK to Users.UserID)
(LocalizationID, LanguageID) - FK to Localization
Это один из недостатков составных первичных ключей - любой FKссылка на них также должна включать в себя все столбцы составного PK - исключения / хитрости / обходные пути невозможны.С двумя столбцами это все еще выполнимо, но с четырьмя, пятью, десятью столбцами это становится действительно очень грязным.Это также означает, что любая JOIN
к этой таблице должна содержать все общие поля - и опять же, с двумя это все в порядке, но с большим количеством это становится действительно грязным.
Это одно изпричины, по которым я часто рассматривал бы добавление искусственного суррогатного ключа в таблицы, в которых у меня есть только составной PK - просто для упрощения соединений с ним FK.