Databases

Реляционные и NoSQL БД

Реляционные БД хранят данные в связанных таблицах со строгой схемой и SQL, NoSQL отказывается от части этих правил ради гибкости схемы и масштабирования.

Что такое реляционная база данных

Реляционная база данных — база, в которой данные хранятся в таблицах, связанных между собой по значениям ключей. Слово «реляционный» происходит от английского relation (отношение) — так в теории Кодда называется таблица. Распространённое заблуждение, что «реляционный» означает «связанный ссылками»: строго говоря, отношение — это и есть сама таблица со строками и колонками.

Три признака реляционной модели:

  • Строгая схема. Набор колонок и их типы объявлены заранее; строка, не подходящая под схему, не будет записана.
  • Связи по значениям. Таблицы соединяются не указателями, а совпадением значений: orders.user_id = users.id.
  • SQL и ACID. Декларативные запросы и транзакции с гарантиями.
CREATE TABLE users (
    id    bigserial PRIMARY KEY,
    email text NOT NULL UNIQUE
);

CREATE TABLE orders (
    id      bigserial PRIMARY KEY,
    user_id bigint NOT NULL REFERENCES users(id),  -- связь
    total   numeric(10,2) NOT NULL CHECK (total >= 0)
);

СУБД не даст вставить заказ с несуществующим user_id и не даст удалить пользователя, у которого есть заказы. Это не код приложения — это гарантия самой базы. Представители: PostgreSQL, MySQL, MS SQL Server, SQLite.

Что такое NoSQL

NoSQL (изначально «Not Only SQL») — общее название для нереляционных СУБД, которые отказываются от части реляционных правил ради других свойств: гибкости схемы, горизонтального масштабирования, скорости на конкретном шаблоне доступа. Это не одна технология, а четыре довольно разных семейства:

Семейство Модель Представители Когда уместно
Документные JSON-документ MongoDBСхема меняется, объект читается целиком
Key-value Ключ → значение RedisКеш, сессии, счётчики
Колоночные Колонки на диске ClickHouseАналитика по миллиардам строк
Графовые Узлы и рёбра Neo4j Обход связей на много уровней

Нереляционная база — это база, не использующая табличную модель со связями по ключам. Отсутствие жёсткой схемы означает, что валидацию структуры берёт на себя приложение.

Реляционные vs NoSQL

Реляционные NoSQL
Схема Задана заранее, меняется миграциейГибкая или отсутствует
Связи JOIN на стороне БДВложенность или сборка в коде
Транзакции ACID как основа Есть, но чаще ограниченные
Масштабирование Прежде всего вертикальное Горизонтальное заложено в дизайн
Запросы Любые, планировщик сам решает как Быстры на предусмотренном шаблоне
Дубли данных НормализацияДенормализация — норма

ACID и BASE

Реляционные СУБД строятся вокруг ACID: транзакция атомарна, согласована, изолирована и надёжна. Многие распределённые NoSQL-системы выбирают BASE — Basically Available, Soft state, Eventually consistent: данные доступны почти всегда, а копии сходятся к одинаковому состоянию не мгновенно.

Причина — теорема CAP: при разрыве сети между узлами распределённая система вынуждена выбирать между согласованностью и доступностью. Практическое следствие: прочитав из реплики сразу после записи, вы можете увидеть старое значение. Для ленты новостей это незаметно, для списания денег — недопустимо.

Что выбрать

Реляционную, если данные связаны, важны транзакции и деньги, запросы заранее не известны. PostgreSQL закрывает подавляющее большинство задач и умеет тип jsonb — документы можно хранить прямо в таблице, не поднимая вторую СУБД.

NoSQL, если структура записей действительно разная, шаблон доступа один и известен заранее, либо объём данных не помещается на один сервер даже после шардирования. Redis — как кеш рядом с основной базой, ClickHouse — под аналитику.

Типичная зрелая архитектура использует и то и другое: PostgreSQL как источник истины, Redis для кеша, ClickHouse для отчётов.

Связанные термины

  • Базы данных — общее понятие
  • СУБД — программы, реализующие обе модели
  • SQL — язык реляционных баз
  • Ключи в БД — то, чем связаны таблицы
  • MongoDB — типичная документная NoSQL-СУБД
  • Шардирование — горизонтальное масштабирование данных

Готовы запустить GPU-задачу?

Запустить GPU-сервер