postgresql переходные уникальные ограничения через внешний ключ - PullRequest
1 голос
/ 28 марта 2020

У меня есть следующая схема:

CREATE TABLE t2 (
    id TEXT PRIMARY KEY,

    t1_id TEXT REFERENCES t1(id)
);

CREATE TABLE t3 (
    id TEXT PRIMARY KEY,

    t2_id TEXT REFERENCES t2(id)
);

CREATE TABLE t4 (
    t4_counter BIGINT NOT NULL,

    t3_id TEXT REFERENCES t3(id),

    // Need UNIQUE constraint on t4_counter + t2_id
);

В нашей системе есть 3 postgresql таблиц (t2, t3, t4). Есть и другие таблицы, но они для краткости игнорируются. Теперь у t2 есть уникальный идентификатор, который в t3 называется FOREIGN KEY. Точно так же t3 имеет уникальный идентификатор, который упоминается как иностранный ключ в t4. Теперь в t4 есть поле с именем t4_counter. Теперь я хочу применить к этой таблице t4 ограничение UNIQUE, так что t4_counter combined with t2_id will always be UNIQUE.

Один простой способ добиться этого - вставить t2_id как новый столбец с ограничением REFERENCES в таблица t4, а затем добавить UNIQUE constraint on (t2_id, t4_counter). Но так как у нас уже есть t3_id в таблице t4, мы должны быть в состоянии рассчитать его транзитивно.

Возможно ли достичь такого уникального ограничения без добавления t2_id в таблицу t4?

I Я использую postgresql 12+ версий, если это имеет значение.

1 Ответ

1 голос
/ 28 марта 2020

Вам нужно будет добавить столбец t2_id как «избыточный», как упоминает @jindra, чтобы обеспечить соблюдение этих отношений. Вы также можете использовать составной ключ для таблицы t4. Это решило бы проблему на уровне базы данных навсегда.

Например:

create table t3 (
  id int not null,
  t2_id int not null references t2(id),
  primary key (id, t2_id) -- composite primary key
);

create table t4 (
  t4_counter bigint not null,

  t3_id int not null,
  t2_id int not null,
  constraint fk1 foreign key (t3_id, t2_id) references t3 (id, t2_id),

  constraint uq1 unique (t2_counter, t2_id)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...