Документация / DBML

Связи и внешние ключи

Определение связей

Связи задают внешние ключи между таблицами, в том числе в разных схемах:

Table posts {
  id integer [primary key]
  user_id integer [ref: > users.id] // многие к одному
}

Table users {
  id integer [ref: < posts.user_id, ref: < reviews.user_id] // один ко многим
}

Типы связей

ОператорТипПример
<один ко многимusers.id < posts.user_id
>многие к одномуposts.user_id > users.id
-один к одномуusers.id - user_infos.user_id
<>многие ко многимauthors.id <> books.id

Необязательные связи

Модификатор ? делает сторону связи необязательной: >? — необязательна ссылаемая сторона, ?> — необязательна исходная сторона.

Table posts {
  id int [pk]
  user_id int [ref: >? users.id]
}

Три формы записи

Длинная форма:

Ref name_optional {
  schema1.table1.column1 < schema2.table2.column2
}

Короткая форма:

Ref name_optional: schema1.table1.column1 < schema2.table2.column2

Встроенная форма — в настройках столбца:

Table schema2.table2 {
  id integer
  column2 integer [ref: > schema1.table1.column1]
}

Составные внешние ключи

Ref: merchant_periods.(merchant_id, country_code) > merchants.(id, country_code)

Связи между схемами

Table core.users {
  id integer [pk]
}

Table blogging.posts {
  id integer [pk]
  user_id integer [ref: > core.users.id]
}

// или отдельно
Ref: blogging.posts.user_id > core.users.id

Настройки связи

Ref: products.merchant_id > merchants.id [delete: cascade, update: no action]

Ref {
  products.merchant_id > merchants.id [delete: cascade, update: no action]
}

Ссылочные действия для delete и update: cascade, restrict, set null, set default, no action.

Связь «многие ко многим»

Есть два способа описать её:

  1. одной связью с оператором <>;
  2. двумя связями «многие к одному» (> и <) через промежуточную таблицу.

Обновлено: 27 сентября 2026 г.