Краткий ответ: Внешние ключи из нескольких столбцов, естественно, относятся к первичным ключам из нескольких столбцов.Может быть автоматически созданный столбец идентификатора, который является частью первичного ключа.
Философский ответ: Первичный ключ - это идентификатор строки .Если там есть немного информации, которая является неотъемлемой частью идентификатора строки (например, к какому клиенту относится статья .. в вики для нескольких клиентов) - информация должна быть частью первичного ключа.
Пример: Система для организации вечеринок в локальной сети
Система поддерживает несколько вечеринок в локальной сети, в которых участвуют одни и те же люди и организаторы:
CREATE TABLE users ( users_id serial PRIMARY KEY, ... );
И существует несколько вечеринок:
CREATE TABLE parties ( parties_id serial PRIMARY KEY, ... );
Но большинство других вещей должны нести информацию о том, с какой стороной они связаны:
CREATE TABLE ticket_types (
ticket_types_id serial,
parties_id integer REFERENCES parties,
name text,
....
PRIMARY KEY(ticket_types_id, parties_id)
);
... это потому, что мы хотим ссылаться на первичные ключи.Внешний ключ на столе посещаемость указывает на таблицу ticket_types .
CREATE TABLE attendances (
attendances_id serial,
parties_id integer REFERENCES parties,
ticket_types_id integer,
PRIMARY KEY (attendances_id, parties_id),
FOREIGN KEY (ticket_types_id, parties_id) REFERENCES parties
);