TGViewer
Fedkin is thinking Fedkin is thinking @fedkin_thinking · 8.98K subscribers
Post #207 8.6K
Зачем нужны многоколоночные foreign key

Представь, тебе нужно описать граф в реляционной модели

Скорее всего получится приблизительно такое:

create table graph (
id bigserial primary key
);

create table node (
id bigserial primary key,
graph_id bigint
);

create table edge (
id bigserial primary key,
from_id bigint,
to_id bigint
);


Далее добавим внешние ключи, чтобы гарантировать целостность

node (graph_id) -> graph (id)
edge (from_id) -> node (id)
edge (to_id) -> node (id)


И на этом в целом можно закончить

Однако схема позволяет создать ребро, которое будет связывать две вершины из разных графов:

graph(id = 1)
graph(id = 2)

node(id = 1, graph_id = 1)
node(id = 2, graph_id = 2)

edge(id = 1, from_id = 1, to_id = 2) // no error


Валидировать такое можно с помощью
- триггеров
- проверок на уровне приложения
- многоколоночных внешних ключей

С первыми двумя вариантами в целом все ясно, а третий рассмотрим подробнее. Реализовать его можно так:

1. Добавляем в таблицу edge колонку graph_id
2. Для ребер многоколоночные внешние ключи:

node (graph_id) -> graph (id)
edge (graph_id, from_id) -> node (graph_id, id)
edge (graph_id, to_id) -> node (graph_id, id)


Такие ключи уже на уровне схемы данных не позволят привязать ребро к вершинам из разных графов

p.s.: для того чтобы сделать многоколоночный внешний ключ, на целевой таблице этот набор колонок должен быть уникальным — в нашем случае должен быть primary key / unique index на node (graph_id, id)
  • 👍 35
  • 🤔 11
  • 🔥 3
  • 💅 1
More from @fedkin_thinking
  1. Sep 27, 2026Короткий гайд по борьбе с FOMO Наши ресурсы ограничены, поэтому вкладывая время и силы в о…
  2. Sep 20, 2026С большинством людей все в порядке Представь, у тебя команда регулярно срывает сроки ревью…
  3. Sep 19, 2026Чему техлиду научиться у Tinder На днях стало интересно, как запускаются сервисы с "сетевы…
  4. Sep 13, 2026Почему рабочие встречи превращаются в балаган — Раскатываем эксп на 100%? — Я бы не раскат…
  5. Sep 12, 2026Перед автоматизацией выясни, существует ли процесс Нулевой шаг автоматизации абсолютно чег…
  6. Aug 31, 2026Полезно понимать, какие проблемы решает твой руководитель Повышение обычно происходит, ког…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →