Реляционные и 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-сервер