dbdiagram.io — веб-сервис для проектирования и документирования структуры баз данных через код на языке DBML. Вы описываете таблицы, поля и связи, а через панель инструментов можете экспортировать построенную ER-диаграмму в PDF/PNG или сгенерировать SQL-код.

Что представляет собой dbdiagram.io

dbdiagram.io — инструмент команды Holistics для работы с диаграммами баз данных. Схема редактируется как текст в левом окне, а визуальное представление автоматически обновляется справа.

Основной формат сервиса — DBML (Database Markup Language), декларативный язык описания баз данных. Он не привязан к одной СУБД и обычно читается компактнее, чем SQL DDL.

Редактор построен на Monaco Editor, который используется в Visual Studio Code. К элементу диаграммы из кода ведут сочетания Ctrl/Command + F12 и Ctrl/Command + Click. Из диаграммы к определению в коде можно перейти двойным щелчком по таблице, колонке, связи или группе таблиц.

Основные возможности

ВозможностьЧто даёт пользователю
DBML → диаграммаВизуальная ER-схема обновляется по мере изменения кода
Импорт схемыПреобразование существующей SQL-схемы или прямого подключения к базе в DBML
ЭкспортГенерация SQL, PDF и PNG через панель инструментов
Совместная работаЛичные и командные рабочие пространства, приглашения и редактирование в реальном времени
Версии и представленияИстория изменений и отдельные виды диаграммы для разных аудиторий
AI AssistantСоздание и изменение DBML по запросу на естественном языке с предварительным просмотром различий
Data SampleПримеры записей рядом со схемой с импортом и экспортом SQL-данных
Data LineageОписание и визуализация движения данных между таблицами и колонками

Базовый синтаксис DBML

Таблицы и поля

Table users {
  id integer [pk, increment]
  username varchar(50) [not null, unique]
  email varchar(100) [not null, unique]
  role varchar(20) [default: 'user']
  created_at timestamp [default: `now()`]
}

Table posts {
  id integer [pk, increment]
  title varchar(255) [not null]
  body text [note: 'Содержимое публикации']
  user_id integer [not null]
  status post_status
  created_at timestamp [default: `now()`]
}
💡
Настройки полей указываются в квадратных скобках. Среди них: pk, not null, unique, default, increment и note. Тип с пробелом, например double precision, заключайте в двойные кавычки.

Связи между таблицами

DBML поддерживает четыре основных оператора:

ОператорТип связиПример
>Многие к одномуposts.user_id > users.id
<Один ко многимusers.id < posts.user_id
-Один к одномуusers.id - profiles.user_id
<>Многие ко многимauthors.id <> books.id

Связь можно записать внутри поля или отдельным выражением:

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

Ref: posts.user_id > users.id

Ref {
  posts.user_id > users.id [delete: cascade, update: no action]
}

С августа 2026 года в оператор можно добавлять ?, чтобы явно обозначить опциональную сторону связи:

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

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

Enum, индексы и проверки

enum post_status {
  draft [note: 'Ожидает публикации']
  published
  archived
}

Table bookings {
  id integer
  country varchar
  booking_date date
  amount decimal

  indexes {
    (id, country) [pk]
    booking_date [type: hash]
    (country, booking_date) [unique]
  }

  checks {
    `amount > 0` [name: 'chk_positive_amount']
  }
}

Для индексов доступны одиночные и составные определения, выражения, первичные и уникальные ключи. В официальной спецификации среди явно поддерживаемых типов индекса указаны btree и hash.

Повторно используемые поля

TablePartial позволяет вынести общий набор полей, настроек и индексов:

TablePartial base_fields {
  id int [pk, not null]
  created_at timestamp [default: `now()`]
  updated_at timestamp [default: `now()`]
}

Table users {
  ~base_fields
  name varchar
  email varchar [unique]
}

Table orders {
  ~base_fields
  total decimal [not null]
  user_id int [ref: > users.id]
}

Примеры данных

С марта 2026 года DBML позволяет хранить демонстрационные записи рядом со схемой:

Table plans {
  id int [pk]
  name varchar
  price decimal

  records {
    1, 'Free', 0
    2, 'Pro', 8
    3, 'Team', 15
  }
}

Можно также использовать внешний блок Records plans(id, name, price). Значения проверяются с учётом типа целевой колонки. Для каждой таблицы допускается один блок записей.

Представления и движение данных

DiagramView

Представления диаграммы можно хранить прямо в DBML. Это помогает показывать разным участникам только нужную часть большой схемы:

DiagramView "Sales Team" {
  Tables {
    customers
    orders
    products
  }
}

DiagramView Engineering {
  Tables {
    users
    sessions
    events
  }
  Schemas {
    core
    analytics
  }
}

Именованные представления доступны на платных планах. На бесплатном плане можно фильтровать таблицы внутри DiagramView Default.

Data Lineage

С августа 2026 года DBML поддерживает зависимости данных через Dep. Связи Ref описывают структуру базы, а Dep показывает, как данные перемещаются и преобразуются:

Dep: stripe_payments -> daily_orders [note: 'Исключение отменённых платежей']

Dep monthly_revenue_build {
  daily_orders.amount -> monthly_revenue.revenue
  daily_orders.ordered_at -> monthly_revenue.month
  refunds.amount -> monthly_revenue.refunds
  note: 'Месячная агрегация с учётом возвратов'
}

Data Lineage доступен на всех планах без ограничения размера проекта. Автоматическое чтение lineage из dbt-проектов и хранилищ в release notes от 21 августа 2026 года обозначено как будущая возможность, поэтому рассчитывать на него в текущем процессе не следует.

Импорт, экспорт и работа из терминала

Через веб-интерфейс схему задают в DBML; для существующих SQL-схем доступны импорт и получение DBML из прямого подключения в поддерживаемых сценариях. Затем диаграмму можно экспортировать в PDF, PNG либо SQL. Такой рабочий процесс удобен для первичного документирования существующей базы.

⚖️
DBML абстрагирует структуру от конкретной СУБД, но не гарантирует полностью автоматическую миграцию. После экспорта для другой базы проверьте типы данных, выражения, ограничения и сгенерированный DDL-код (Data Definition Language, язык определения данных).

С июля 2026 года официальный пакет dbdiagram синхронизирует локальный .dbml с веб-диаграммой:

npm install -g dbdiagram

dbdiagram auth login
dbdiagram init --entry schema.dbml --diagram-id YOUR_DIAGRAM_ID

# Локальный DBML → веб-диаграмма
dbdiagram push

# Веб-диаграмма → локальный файл
dbdiagram pull

Команды push и pull передают схему и расположение таблиц. Для автоматизации в CI используется переменная DBDIAGRAM_TOKEN; реальный токен нельзя сохранять в репозитории или вставлять в пример команды.

Отдельная экосистема DBML включает конвертеры для командной строки и JavaScript-модуль @dbml/core, но версии и системные требования перед установкой следует проверять в актуальной документации.

AI Assistant и ограничения планов

AI Assistant создаёт и изменяет таблицы, связи, индексы и типы данных по запросу на естественном языке. Перед применением сервис показывает изменения в режиме сравнения.

Доступность и квота зависят от плана. В документации, проверенной 3 сентября 2026 года, AI Assistant указан для Personal Pro; там же приведены следующие месячные квоты:

ПланКвота AI Assistant
Personal Pro1 000 000 токенов
Пробный Team на 7 дней50 000 токенов на участника
Team2 000 000 токенов на участника
Organization4 000 000 токенов на участника
EnterpriseБез ограничения

Квота расходуется и на запросы, и на ответы. После её исчерпания новые сообщения недоступны до первого дня следующего месяца.

⚠️
По умолчанию диаграммы пользователей Free доступны всем, у кого есть ссылка. Не помещайте в такую диаграмму пароли, токены, строки подключения, реальные персональные данные и закрытые детали инфраструктуры.

Цены и состав планов могут меняться. Перед выбором подписки проверяйте текущие условия на сайте сервиса.

Полезные сценарии

Спроектировать схему нового приложения

Исходные данные: перечень сущностей и бизнес-правил. Опишите таблицы и связи в DBML, визуально проверьте кардинальность, затем экспортируйте SQL.

Результат: команда получает читаемую диаграмму и версионируемый файл схемы. Перед применением проверьте DDL в тестовой базе; визуально корректная диаграмма не гарантирует правильность ограничений и типов.

Задокументировать существующую базу

Импортируйте SQL-схему или получите DBML через поддерживаемое подключение, добавьте note к таблицам и колонкам, затем сохраните .dbml в репозитории.

Результат: структуру можно просматривать как диаграмму и обновлять через dbdiagram push. Этот сценарий описывает схему, но не заменяет документацию бизнес-смысла полей и процессов обновления данных.

Подготовить разные виды большой схемы

Добавьте DiagramView для отдельных команд или бизнес-направлений. Проверьте, что каждое представление содержит только нужные таблицы и схемы.

Результат: одна DBML-модель даёт несколько сфокусированных диаграмм. Для именованных представлений потребуется платный план.

Показать происхождение показателя

Опишите переходы между исходными и итоговыми таблицами через Dep, при необходимости укажите отдельные колонки и поясняющие заметки.

Результат: на одной диаграмме видны структура и маршрут данных. Автоматический импорт lineage из dbt или хранилища пока не заявлен как готовая функция.

Как проверить результат

Минимальная проверка для новой схемы:

  1. Вставьте в редактор определения двух связанных таблиц.
  2. Убедитесь, что обе таблицы появились в правой части интерфейса, а между ними отображается связь.
  3. Выполните экспорт SQL и проверьте наличие таблиц, первичных и внешних ключей.
  4. Если используется пакет dbdiagram, выполните dbdiagram push, откройте связанную диаграмму и сравните схему и позиции таблиц.
  5. Применяйте DDL сначала к тестовой базе и проверяйте результат средствами выбранной СУБД.

Официальные ссылки

Следующий шаг

Notion Dashboards: комбинированные представления

Схема как код особенно полезна, когда её читают разные участники команды и изменения нужно проверять до применения к базе. Если вы выстраиваете такой процесс, его границы и порядок проверки можно обсудить.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov