简短回答:多列外键自然地参考多列主键。仍然可以有一个自动生成的id列作为主键的一部分。
哲学回答:
主键是行的身份标识。如果有一些信息是行身份的固有部分(例如文章属于哪个客户,在多客户维基中),则该信息应是主键的一部分。
举个例子:组织局域网派对的系统
该系统支持多个局域网派对,参与者和组织者相同,因此:
```html
CREATE TABLE lan_party (
party_id INT NOT NULL,
person_id INT NOT NULL,
PRIMARY KEY (party_id, person_id)
);
```
这里,`party_id` 和 `person_id` 组成了复合主键。
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)
);
这是因为我们想要引用主键。表attendances上的外键指向表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
);