Содержание

Для большинства веб-продуктов основной базой стоит выбрать реляционную — обычно PostgreSQL: она даёт транзакции, связи между данными, гибкие запросы и умеет хранить JSON. NoSQL-базы стоит добавлять рядом под конкретные задачи: Redis — для кеша и очередей, колоночные — для аналитики, поисковые — для полнотекстового поиска, графовые — для сложных связей.

Разберём, какие бывают базы данных, чем они отличаются и как выбрать под задачу.

Чем SQL отличается от NoSQL?

SQL-базы хранят данные в таблицах со строгой схемой и связями и поддерживают транзакции с гарантиями согласованности. NoSQL — общее название для баз с другими моделями данных: документами, парами ключ-значение, колонками или графами. Они жертвуют частью гарантий или гибкости запросов ради масштабирования или скорости на определённых задачах.

Тип Примеры Модель данных Для чего
Реляционные PostgreSQL, MySQL Таблицы и связи Основные данные продукта
Документные MongoDB JSON-документы Гибкие структуры, каталоги с разными атрибутами
Ключ-значение Redis Ключ и значение в памяти Кеш, сессии, счётчики, очереди
Колоночные ClickHouse Колонки для аналитики Отчёты по миллиардам строк
Графовые Neo4j Узлы и связи Рекомендации, социальные связи
Поисковые Elasticsearch, Meilisearch Инвертированный индекс Полнотекстовый поиск

Почему реляционная база — разумный выбор по умолчанию?

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

Что даёт реляционная база:

  • транзакции — несколько изменений выполняются целиком или не выполняются вовсе;
  • целостность — внешние ключи и ограничения не дают сохранить противоречивые данные;
  • гибкие запросы — объединения, группировки и отчёты без заранее подготовленных структур;
  • JSON при необходимости — в PostgreSQL можно хранить и индексировать документы.

Как выбрать между двумя популярными вариантами — в статье PostgreSQL или MySQL, а про транзакции подробнее — в материале транзакции и уровни изоляции.

Деревянные буквы, складывающиеся в слово data Фото: Unsplash

Когда документная база действительно лучше?

Документная база лучше, когда данные естественно представляются независимыми документами с разной структурой, их редко нужно объединять между собой, а схема часто меняется. Например, журнал событий от разных устройств или контент с произвольными блоками.

Признаки, что документная база подходит:

  1. Документ читается и записывается целиком, а не по частям из разных таблиц.
  2. Связи между документами редкие и простые.
  3. Структура сильно отличается от записи к записи.
  4. Строгие транзакции между несколькими документами не нужны.

Если же в проекте появляются заказы, остатки и платежи, документная модель начинает мешать: связи приходится поддерживать вручную, а целостность — проверять в коде.

Какие NoSQL-базы добавляют рядом с основной?

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

Как не ошибиться с выбором?

Чтобы не ошибиться, выбирайте базу по тому, как данные будут читаться и меняться, а не по моде. Опишите основные сущности, связи между ними и самые частые запросы — обычно после этого ответ становится очевидным.

  • не выбирайте NoSQL только ради «масштабирования на будущее» — реляционные базы масштабируются дальше, чем нужно большинству продуктов;
  • не храните деньги и остатки там, где нет транзакций;
  • не добавляйте новую базу, пока существующая справляется: каждая база — это бэкапы, мониторинг и экспертиза;
  • проверяйте выбор на реальных запросах и объёмах.

Коротко

  • По умолчанию выбирайте реляционную базу — чаще всего PostgreSQL.
  • NoSQL — это разные модели данных: документы, ключ-значение, колонки, графы.
  • Документные базы хороши для независимых документов с разной структурой.
  • Redis, ClickHouse, поиск и векторные базы добавляют рядом под конкретные задачи.
  • Выбирайте по тому, как данные читаются и меняются, а не по моде.

Частые вопросы

  • Правда ли, что NoSQL быстрее SQL?

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

  • Можно ли хранить JSON в PostgreSQL?

    Да, тип jsonb позволяет хранить документы, индексировать поля внутри них и делать по ним запросы. Это закрывает многие сценарии, ради которых раньше брали документную базу.

  • Сложно ли поменять базу данных позже?

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