Совсем нет. Ссылка внешнего ключа должна быть на первичный ключ. В этом случае у вас есть составной первичный ключ (хотя это, вероятно, не требуется, см. Ниже). Хотя ссылки внешнего ключа на уникальные ключи разрешены (а некоторые базы данных даже допускают ссылки внешнего ключа на любые индексированные столбцы), это не лучший способ.
Когда вы используете составной первичный ключ (ваш второй пример), вы гарантируете, что id
/ name
выровнены в первой таблице. Когда вы используете отдельные ссылки (ваш первый пример), вы не знаете, что они выровнены, поэтому id
может ссылаться на одну строку в table1
, а name
- на другую строку. Я сомневаюсь, что это твое намерение.
В любом случае повторение избыточных данных между таблицами является плохой практикой. Лучшая модель данных:
CREATE TABLE table1 (
id INT PRIMARY KEY,
name VARCHAR(100) UNIQUE,
description VARCHAR(100),
);
CREATE TABLE table2 (
id INT PRIMARY KEY,
table1_id INT,
FOREIGN KEY (table1_id) REFERENCES table1(id)
);
Затем, если вы хотите соответствующий name
, найдите имя в первой таблице.
Как заметка, в Postgres я ожидал, что INT
будет действительно SERIAL
, поэтому база данных присваивает уникальное, увеличивающееся значение при вставке новых строк.
Если вы действительно хотите две ссылки на table1
, тогда используйте две ссылки на id:
CREATE TABLE table2 (
id INT PRIMARY KEY,
table1_id INT,
table1_id_2 INT,
FOREIGN KEY (table1_id) REFERENCES table1(id),
FOREIGN KEY (table1_id_2) REFERENCES table1(id)
);