8 мин

Типы баз данных: реляционные, документные, графовые и др.

Разбираем типы баз данных: реляционные, колоночные, документные, графовые, векторные, key‑value и другие. Плюсы, минусы и когда что выбирать.

Типы баз данных: реляционные, документные, графовые и др.

Что такое типы баз данных и чем они отличаются

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

Эта статья помогает выбрать хранилище под задачу: какие у вас данные, какие запросы вы делаете, как вы будете расти (объём и нагрузка) и сколько будет стоить эксплуатация (железо/облако, команда, администрирование, риски).

Мини-словарь терминов

Схема — правила, по которым устроены данные (какие поля есть и каких они типов). В одних БД она строгая (обычно SQL), в других допускается гибкость (часто документные).

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

Индексы — «оглавление» для данных. Они ускоряют поиск и сортировку, но требуют места и замедляют запись (индекс тоже нужно обновлять).

Репликация — копирование данных на другие узлы. Нужна для отказоустойчивости и иногда для ускорения чтения.

Как читать сравнение типов БД

Не ищите «лучшую базу данных». Правильнее мыслить сценариями:

  • Что чаще: запись или чтение?
  • Запросы точечные или сканируют большие объёмы?
  • Данные хорошо укладываются в таблицы или структура часто меняется?
  • Насколько критична точная согласованность «прямо сейчас»?

Дальше разберём основные классы (SQL, колоночные, документные, графовые, векторные, key-value) и покажем, где каждый даёт максимум пользы — и какие компромиссы за это приходится платить.

OLTP и OLAP: два разных класса задач

OLTP и OLAP — это не «виды баз данных», а два класса нагрузок, которые по‑разному нагружают хранилище. Ошибка на этом уровне часто приводит к тому, что база «вроде бы подходит», но в реальности оказывается медленной или слишком дорогой.

OLTP: много мелких операций и строгая корректность

OLTP (Online Transaction Processing) — это повседневные транзакции: оформление заказа, списание со склада, перевод денег, обновление профиля.

Типично для OLTP:

  • частые записи и чтения небольших порций данных (1–10 строк);
  • важнее всего низкая латентность: пользователь ждёт ответ «прямо сейчас»;
  • строгая корректность (ACID): либо операция прошла полностью, либо не прошла вообще.

OLAP: аналитика, агрегации и большие сканы

OLAP (Online Analytical Processing) — это отчёты и анализ: «выручка по дням», «топ товаров по регионам», «воронка по каналам».

Характерно для OLAP:

  • агрегации и группировки по большим периодам;
  • сканирование больших объёмов (чтение «много строк сразу»);
  • важнее пропускная способность (сколько данных можно прогнать за минуту), а не миллисекунды на один запрос.

Масштабирование простыми словами

  • Вертикальное масштабирование — поставить сервер мощнее (больше CPU/RAM/SSD). Проще, но есть предел, и цена растёт.
  • Горизонтальное масштабирование — добавить несколько серверов и распределить данные/запросы. Гибче, но сложнее в настройке.

Латентность, пропускная способность и стоимость запроса

Для OLTP обычно критична латентность (p95/p99), потому что каждый запрос «на виду». Для OLAP чаще критичны стоимость и скорость больших запросов: сканы, джойны, агрегаты могут быть дорогими, но выполняются реже и часто пакетно.

Практичный ориентир: если типичный запрос — «найти/обновить сущность по ключу», вы ближе к OLTP. Если «посчитать/сравнить/свести по миллионам строк», вы ближе к OLAP.

Реляционные базы данных (SQL): где они незаменимы

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

SQL как общий язык и сила строгой схемы

SQL — универсальный язык работы с данными: его понимают разработчики, аналитики и большинство BI‑инструментов. Строгая схема (типы столбцов, обязательные поля) и ограничения помогают ловить ошибки на входе, до того как данные «разъедутся» по системе.

Транзакции и ACID: почему это важно

Когда нужна корректность (например, списать деньги и создать запись о платеже), нужны ACID‑гарантии: атомарность, согласованность, изоляция, долговечность. Уровни изоляции (например, Read Committed или Serializable) позволяют управлять тем, как параллельные операции влияют друг на друга — это напрямую связано с гонками, «двойными списаниями» и корректностью остатков.

Сильные стороны

Главные козыри SQL‑СУБД:

  • JOIN для связных данных;
  • ссылочная целостность (foreign key), уникальность, проверки (constraints);
  • развитая оптимизация запросов;
  • зрелая эксплуатация: миграции схем, репликация, мониторинг, резервные копии.

Ограничения, о которых стоит помнить

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

Также данные со сложными иерархиями и «глубокими» связями иногда удобнее выражать в документных или графовых БД, чтобы не превращать модель в набор громоздких JOIN.

Колоночные базы данных: аналитика и большие сканы

Колоночные базы данных хранят данные «по столбцам», а не «по строкам». Для аналитики это часто решающий плюс: когда вы считаете суммы, средние, распределения или строите отчёты, запросу обычно нужны 2–5 столбцов из широкой таблицы, а не вся строка целиком. Колонка читает и обрабатывает именно нужные столбцы — меньше I/O, меньше лишних данных в памяти, быстрее агрегации.

Где колонка особенно полезна

Колоночные БД выбирают там, где много «больших сканов» и группировок:

  • отчёты и BI‑панели (финансы, продажи, маркетинг);
  • продуктовая аналитика (воронки, ретеншн, когорты);
  • логирование и события (клики, просмотры, телеметрия);
  • расследования и ad‑hoc запросы по большим массивам.

Почему это быстро: простая интуиция

Три идеи, которые обычно дают прирост производительности:

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

Векторизация. Вместо обработки «по одной строке» движок работает блоками значений (пакетами), лучше используя CPU и кэш.

Партиционирование. Данные делятся на части (например, по дате). Тогда запрос «за последние 7 дней» не трогает старые партиции.

Ограничения: когда колонка не лучший выбор

Колоночные БД обычно хуже справляются с частыми точечными обновлениями и высокой транзакционной нагрузкой (много мелких INSERT/UPDATE с жёсткими SLA). Там, где важны быстрые операции по одной записи и сложные транзакции, чаще выигрывают OLTP‑решения.

Как сочетать с OLTP на практике

Распространённый подход — разделить контуры: OLTP обслуживает приложение, а колонночная БД — аналитику. Данные доставляют через репликацию или CDC (Change Data Capture), чтобы аналитика получала почти «живую» копию событий без нагрузки на боевую базу.

Документо-ориентированные БД: гибкость без лишних JOIN

Документо-ориентированные базы данных хранят данные не в строках таблиц, а в «документах» — чаще всего в JSON (или близких форматах вроде BSON). Документ похож на объект в коде: в нём можно держать поля разного типа, вложенные структуры и массивы. Схема при этом гибкая: разные документы в одной коллекции могут иметь разные наборы полей.

Когда гибкая схема особенно удобна

Документный подход хорошо ложится на данные, которые естественно «собираются» вокруг одной сущности:

  • каталоги товаров (атрибуты отличаются по категориям);
  • профили пользователей (настройки, предпочтения, устройства);
  • контент (страницы, посты, комментарии, метаданные);
  • события и логи (много источников и версий).

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

Запросы и индексация

Несмотря на «безтабличность», это не просто хранилище JSON. Обычно доступны фильтры по атрибутам, сортировки и агрегации, а также индексы по полям (включая вложенные). Например, можно индексировать user.email или элементы массива tags, чтобы поиск не превращался в полный скан.

Плюсы и риски

Главный плюс — скорость развития модели: меньше миграций и проще добавлять новые поля по мере роста продукта.

Типичные риски:

  • дублирование данных (при «встраивании» связанных сущностей);
  • неудобство связей «многие‑ко‑многим» без JOIN;
  • согласованность обновлений: если один факт хранится в нескольких местах, нужно дисциплинированно обновлять их вместе.

Документные БД (например, MongoDB) часто выбирают, когда важны гибкость и быстрые изменения, а строгая нормализация не является приоритетом.

Графовые БД: когда связи важнее таблиц

Кредиты за контент и рефералов
Получайте кредиты за контент о TakProsto или за приглашения по реферальной ссылке.

Графовая база данных хранит информацию как граф: есть вершины (объекты), рёбра (связи между объектами) и свойства (атрибуты и у вершин, и у рёбер). Аналогия: «пользователь» — вершина, «дружит» — ребро, «дата знакомства» — свойство ребра.

Запросы по связям: где графы особенно сильны

Графовые БД удобны, когда главный вопрос — «как объекты связаны» и «что находится рядом»:

  • рекомендации: «пользователи, похожие на меня через 2–3 шага связей»;
  • социальные графы: друзья друзей, общие интересы, сообщества;
  • зависимости: сервисы и их зависимости, цепочки поставок, влияние изменений.

Почему это сложно в SQL на больших данных

В реляционной модели связи выражаются через внешние ключи и JOIN. Когда запрос требует много «переходов» (JOIN за JOIN’ом), он становится громоздким и часто дорогим по вычислениям. На больших наборах данных такие многократные соединения могут резко ухудшать время ответа — особенно если нужно пройти несколько уровней отношений и фильтровать по свойствам на каждом шаге.

Типичные преимущества графовых БД

Сильные стороны — это обходы графа (traversal), поиск соседей (k-hop), кратчайшие пути и другие алгоритмы, где важно быстро перемещаться по связям, а не сканировать таблицы.

Ограничения и практические нюансы

Графовые БД сложнее масштабировать горизонтально: распределять данные так, чтобы «частые» связи не разрывали граф на разные узлы, непросто. Также придётся выбрать язык запросов и инструменты (например, Cypher, Gremlin, SPARQL) и убедиться, что экосистема подходит вашей команде и сценариям продакшена.

Векторные БД: семантический поиск и задачи ИИ

Векторные базы данных хранят не только «текст как текст», а его числовое представление — эмбеддинг. Эмбеддинги создают модели машинного обучения: они кодируют смысл фразы, абзаца, картинки или аудио в массив чисел. Поэтому вместо «найти слово X» можно искать «найти похожее по смыслу», даже если совпадений по словам нет.

Как работает поиск «по смыслу»

Запрос тоже превращается в эмбеддинг. Дальше система ищет ближайшие векторы (обычно по косинусной близости или евклидовому расстоянию). Полный перебор дорогой, поэтому используют векторные индексы ANN (Approximate Nearest Neighbors): они ускоряют поиск, но могут слегка терять точность.

Компромисс простой: больше точности — больше времени/памяти; больше скорости — выше риск пропустить часть релевантных результатов. На практике это настраивают под SLA (например, 100–300 мс на поиск при приемлемом качестве).

Типовые сценарии

Самые популярные применения: RAG (добавление найденных фрагментов в контекст LLM), поиск по корпоративным документам, мультимодальный поиск (текст ↔ изображение), а также дедупликация и поиск похожих объектов (товары, вакансии, обращения в поддержку).

Что хранить вместе

Обычно сохраняют: (1) сам вектор, (2) метаданные для фильтров (язык, дата, права доступа, источник), (3) исходный текст/фрагмент или ссылку на него. Важно заранее решить, где будет «источник истины»: в векторной БД или в отдельном хранилище — чтобы обновления и доступы были предсказуемыми.

Ограничения и контроль качества

Векторные индексы не любят частых массовых обновлений: перестроение может быть дорогим. Качество нужно измерять: набор эталонных запросов, метрики (precision@k, recall@k), проверка «галлюцинаций» RAG и регулярная переоценка релевантности при смене модели эмбеддингов.

Key-value хранилища: скорость и простота

Key-value хранилище — минималистичная модель данных: ключ → значение. Ключ обычно строковый, а значение — что угодно (строка, JSON, бинарные данные). Схемы таблиц нет, связей между сущностями тоже: вы всегда обращаетесь к данным по ключу.

Где они особенно полезны

Сильная сторона key-value — быстрые операции чтения/записи по ключу при высокой конкуренции.

Типичные сценарии:

  • кеш: результаты дорогих вычислений, ответы API, фрагменты страниц;
  • сессии и токены: хранение состояния пользователя с TTL;
  • счётчики и метрики: лайки, просмотры, лимиты, rate limiting;
  • флаги и настройки: feature flags, конфиги, «переключатели»;
  • очереди/потоки: у некоторых движков есть структуры данных для списков, стримов и pub/sub.

Плюсы: почему они такие быстрые

Key-value хорошо масштабируются, потому что запросы простые и предсказуемые: «дай значение по ключу» или «запиши значение по ключу». Это даёт низкую задержку, высокую пропускную способность и относительно простую модель масштабирования (например, по диапазонам/хешам ключей).

Минусы: за скорость платят выразительностью

Основное ограничение — сложные выборки. Если нужно «найти всех пользователей из города X с подпиской Y» или сделать отчёт по многим полям, key-value быстро становится неудобным: придётся поддерживать дополнительные индексы вручную, дублировать данные или переносить аналитику в другую БД. «JOIN‑ов» по сути нет.

Кеш или постоянное хранилище?

Важно заранее решить, это только кеш или источник истины:

  • Для кеша нормально, если данные могут пропасть (перезапуск, вытеснение из памяти) — приложение просто пересчитает их.
  • Для постоянного хранилища нужны гарантии: сохранение на диск, репликация, резервные копии, понятная стратегия восстановления.

Практическое правило: если потеря данных болезненна или требуется сложный поиск — используйте key-value как ускоритель рядом с основной БД, а не вместо неё.

Другие классы: wide-column, time-series, full-text и события

Разделите OLTP и аналитику
Наметьте контуры и синхронизацию данных, чтобы отчеты не мешали транзакциям.

Помимо «классических» SQL/NoSQL есть специализированные хранилища, которые выигрывают на конкретных типах нагрузок. Они не «лучше вообще», но часто дают заметную экономию времени и денег при правильном применении.

Wide-column (семейства столбцов)

Wide-column БД (например, Cassandra, HBase) хранят данные в виде строк с очень большим числом разреженных колонок, сгруппированных в «семейства». Это не то же самое, что колоночная аналитика: аналитические колоночные БД оптимизированы под массовые сканы и агрегации, а wide-column — под быстрые чтения/записи по ключу и предсказуемые запросы.

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

Time-series БД

Time-series решения (InfluxDB, Prometheus-стиль хранения, TimescaleDB и др.) заточены под метрики и события во времени: много точек, постоянная запись, типовые запросы «за последние 15 минут/7 дней».

Обычно есть:

  • ретеншн (политики хранения) и автоматическое удаление старых данных;
  • downsampling/агрегация (например, минутные данные превращаются в часовые);
  • быстрые оконные функции, группировки по времени и теги/лейблы;
  • поддержка алертов и интеграций с мониторингом.

Search/Full-text движки

Полнотекстовые движки (Elasticsearch/OpenSearch/Solr) строят инвертированный индекс: вместо «где встречается слово» поиск становится быстрым. Они сильны в:

  • релевантности (ранжирование);
  • комбинировании текста с фильтрами/фасетами;
  • автодополнении, морфологии, синонимах.

При этом они чаще выступают поисковым слоем, а не единственным «источником истины».

Event store и стриминговые журналы

Event store и журналы (Kafka/Pulsar, EventStoreDB) хранят неизменяемую последовательность событий. Концептуально это позволяет считать события первичными, а «текущие состояния» — производными представлениями, которые можно пересобрать.

Как выбрать и не перегрузить архитектуру

Добавляйте специализированное хранилище, если:

  • есть измеримая боль (задержки, стоимость, ограничения запросов);
  • требование устойчиво и долгоживущо (поиск, метрики, события);
  • вы готовы к операционным расходам (поддержка, бэкапы, мониторинг).

Если сомневаетесь, начните с минимальной схемы «основная БД + специализированный слой» и заранее определите границы ответственности данных.

Согласованность и доступность: как не ошибиться с ожиданиями

Когда база данных распределена по нескольким узлам или дата-центрам, неизбежно возникает выбор между тремя желаниями: чтобы данные везде были одинаковыми (консистентность), чтобы система отвечала всегда (доступность) и чтобы она продолжала работать при сетевых разрывах между узлами (устойчивость к разделению сети). CAP‑идея проста: при реальных сетевых сбоях нельзя гарантировать одновременно «идеальную одинаковость» и «ответ всегда».

Сильная vs итоговая согласованность

Сильная согласованность означает: после успешной записи любой следующий запрос видит новое значение. Для пользователя это выглядит как «система помнит прямо сейчас» — критично для денег, остатков, статусов заказов.

Итоговая (eventual) согласованность допускает задержку: запись разойдётся по репликам не мгновенно, и часть пользователей некоторое время увидит старые данные. Это часто нормально для ленты, счётчиков просмотров, рекомендаций, метрик.

Репликация и кворум: почему «всё сразу» иногда дорого

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

Транзакции в распределённых системах

Транзакции уровня «всё или ничего» становятся сложнее, когда данные на разных узлах. Двухфазный коммит и похожие механизмы добавляют ожидание и точки отказа, поэтому многие продукты ограничивают кросс‑шардовые транзакции или предлагают упрощённые модели.

Как сформулировать требования

Спросите себя: что будет хуже — редкое «не отвечает» или редкое «показали старое»? Для платежей и заказов чаще выбирают консистентность; для ленты/метрик — доступность и скорость. Этот ответ затем определяет тип хранилища, настройки репликации и ожидания от SLA (см. также /blog/kak-vybrat-bazu-dannyh).

Производительность: индексы, шардинг и стоимость хранения

Производительность базы данных почти всегда упирается в три вещи: как вы ищете данные (индексы), как распределяете нагрузку (партиционирование/шардинг) и сколько стоит хранить «всё это» годами. Хорошая новость: большинство проблем предсказуемы и решаются правильными базовыми решениями.

Индексы: выбираем под запросы, а не «на всякий случай»

B-tree — универсальный выбор для диапазонов и сортировок (даты, цены, ORDER BY). Хеш‑индексы полезны для точного равенства по ключу, но часто хуже подходят для диапазонов.

Инвертированный индекс нужен для полнотекстового поиска (слова, токены, фильтры по тексту). В графовых БД индексируют идентификаторы и свойства узлов/рёбер, но скорость часто определяет сама модель связей.

Для векторных БД важен ANN‑индекс (Approximate Nearest Neighbor): он ускоряет семантический поиск, но даёт компромисс между точностью, памятью и скоростью.

Партиционирование и шардирование: ключ решает всё

Партиционирование делит данные внутри одной системы (часто по времени), шардирование — распределяет по узлам. Ключ выбирают так, чтобы:

  • запросы чаще попадали в один раздел/шард;
  • запись распределялась равномерно;
  • не возникало «узких мест» при росте.

Типичный анти‑пример — шардировать по признаку, который почти всегда одинаковый (например, один «tenant» или один регион): получится перекос.

Горячие ключи и перекос нагрузки

Симптомы простые: один шард/партиция перегружены, p95/p99 задержек растут, очередь запросов увеличивается, а остальные узлы простаивают. Лечат «солеванием» ключей, переразбиением, кэшированием и пересмотром схемы доступа.

Хранение и стоимость: сжатие, TTL и уровни

Сжатие снижает цену хранения и ускоряет сканы в колоночных БД, но может удорожать запись. TTL помогает автоматически удалять устаревшее. Для больших объёмов полезны горячие/холодные уровни: быстрые диски для свежих данных, более дешёвые — для архива.

Наблюдаемость: метрики с первого дня

Минимальный набор: QPS, p50/p95/p99 латентности, ошибки, cache hit ratio, время/частота компакции, размер индексов, задержка репликации, распределение нагрузки по шардам, «тяжёлые» запросы и блокировки. Это позволяет ловить деградации до того, как их заметят пользователи.

Архитектуры: одна БД vs несколько хранилищ

Спланируйте схему до кода
В planning mode зафиксируйте сущности, запросы и SLA до генерации кода.

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

Единая БД: проще старт, сложнее рост

Монолитной системе часто достаточно одной SQL‑БД: единые транзакции, понятная модель данных, меньше движущихся частей.

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

Разделение по доменам и polyglot persistence

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

Polyglot persistence — это когда вы осознанно берёте 2–3 подходящих хранилища под разные нагрузки, а не разводите «зоопарк из 10». Цель — изоляция задач (транзакции, аналитика, поиск), а не коллекция технологий.

Как хранилища «склеиваются»

Чтобы данные не расползались, заранее выберите паттерн интеграции:

  • CDC (Change Data Capture): изменения из OLTP транслируются в витрины/индексы;
  • очереди/стриминг: события домена как основной способ обмена;
  • батчи: когда важнее простота и допустима задержка;
  • материализованные представления: готовые срезы под конкретные запросы.

Пример связки без лишней сложности

Частая практичная комбинация: OLTP в SQL (заказы/оплаты) + колоночная БД для аналитики + full‑text для поиска по тексту + векторное хранилище для семантического поиска.

Чтобы удержать сложность, договоритесь о правилах: контракт данных (что и в каком виде публикуется), версионирование схем, один владелец домена и понятные SLA на обновление витрин.

Как быстрее проверить выбор на практике (и где здесь может помочь TakProsto.AI)

Даже хороший теоретический выбор БД легко «сломать» реализацией: не теми индексами, неудачным ключом шардинга или смешением OLTP и отчётов в одном контуре. Поэтому полезно как можно раньше собрать небольшой вертикальный срез приложения и прогнать его под реальным профилем запросов.

Если вы делаете прототип или пилот, TakProsto.AI может ускорить этот этап: на платформе можно в формате чата собрать веб‑интерфейс, серверную часть и схему хранения, быстро накидать ключевые запросы и посмотреть, где возникают блокировки, «тяжёлые» SELECT и проблемы с индексами. Типичный стек при этом — React на фронтенде и Go + PostgreSQL на бэкенде, а при необходимости проект можно разложить по сервисам, подключить дополнительные хранилища и выгрузить исходники. Важно и то, что TakProsto.AI работает на серверах в России и использует локализованные/opensource‑модели, не отправляя данные за пределы страны — это удобно для проектов с требованиями к размещению данных.

Как выбрать базу данных: практический чек‑лист

Выбор БД — это не «какая лучше», а «какая закроет ваши запросы и ограничения». Ниже — порядок действий, который помогает не переплачивать и не упереться в потолок через полгода.

1) Быстрый чек‑лист до того, как смотреть на бренды

Сформулируйте ответы в одном документе:

  • Тип запросов: транзакции и частые обновления, отчёты с большими сканами, поиск по тексту, обход связей, семантический поиск.
  • Данные и рост: текущий объём, скорость прироста, «горячие» и «холодные» данные.
  • SLA: задержки (p95/p99), доступность, RPO/RTO.
  • Бюджет и команда: стоимость железа/облака, лицензии, кто администрирует.

2) Протестируйте на данных, близких к реальности

Не полагайтесь на синтетику. Возьмите срез прод‑данных (с обезличиванием), воспроизведите профиль запросов и параллельность. Смотрите не только среднее время, но и хвосты, размер индексов, скорость бэкапов и восстановления.

3) Миграции и риски

Оцените заранее: объём переноса, совместимость типов и транзакций, простои. Заложите план двойной записи или репликации на время переезда и обязательный план отката.

4) Безопасность и комплаенс

Проверьте: роли и минимальные права, аудит, шифрование, управление ключами, регулярные резервные копии и (обязательно) тест восстановления.

Короткие выводы

  • OLTP чаще ведёт к реляционным и/или документным решениям.
  • OLAP и большие сканы — к колоночным.
  • Сложные связи — к графовым.
  • Семантика/поиск по смыслу — к векторным.
  • Максимальная простота и скорость по ключу — к key-value.

Ограничьте выбор до 1–2 кандидатов и проведите короткий пилот на реальной нагрузке — это обычно быстрее и надёжнее любых «вечных» споров о технологиях.

FAQ

Как понять, что вам нужна именно другая база данных, а не «база побыстрее»?

Тип БД выбирают не по названию, а по профилю нагрузки:

  • OLTP: много коротких операций (создать заказ, списать остаток), важны транзакции и низкая задержка.
  • OLAP: длинные запросы по большим объёмам (отчёты, агрегации), важны сканы и пропускная способность.
  • Поиск/связи/семантика: отдельные классы (full-text, граф, векторы) часто дают кратный выигрыш.

Если большинство запросов — «найти/обновить по ключу», вы ближе к OLTP; если «посчитать по миллионам строк» — к OLAP.

Чем OLTP отличается от OLAP и почему это влияет на выбор БД?

OLTP — это транзакции в приложении: частые INSERT/UPDATE, чтение по ключу, строгая корректность (ACID), важны p95/p99 задержек.

OLAP — аналитика: много GROUP BY, фильтров по периодам, сканы больших таблиц, важнее стоимость и скорость выполнения тяжёлых запросов.

Практика: не пытайтесь «всё делать в одной базе», если отчёты мешают транзакциям — лучше разделять контуры.

Когда реляционная (SQL) база данных — самый безопасный выбор?

SQL‑БД обычно лучший выбор, когда нужны:

  • транзакции и ACID (деньги, остатки, статусы заказов);
  • связанные данные и удобные JOIN;
  • ограничения (уникальность, внешние ключи) для защиты качества данных;
  • зрелые процессы: миграции схемы, бэкапы, репликация, мониторинг.

Если у вас «источник истины» и много бизнес‑правил — чаще всего стартуйте с SQL.

Зачем нужны колоночные базы данных и почему они быстры в аналитике?

Колоночные БД хранят данные по столбцам, поэтому аналитические запросы читают только нужные колонки и меньше гоняют диском/памятью.

Они особенно полезны для:

  • отчётов и BI;
  • продуктовой аналитики (воронки, когорты);
  • логов/событий и ad‑hoc расследований.

Но для частых точечных обновлений и строгих OLTP‑SLA они обычно хуже: запись и изменения «по одной строке» могут быть дорогими.

Когда документная БД лучше таблиц, и какие у неё типичные риски?

Документные БД удобны, когда данные естественно собираются вокруг одной сущности и схема часто меняется:

  • каталоги товаров с разными атрибутами;
  • профили пользователей и настройки;
  • контент и метаданные;
  • события с разными наборами полей.

Полезный приём: проектируйте документы под частые чтения «одним запросом», но следите за рисками дублирования и сложных связей «многие‑ко‑многим».

В каких случаях графовая БД даст выигрыш по сравнению с SQL?

Графовая БД выигрывает, когда главный вопрос — связи и переходы по ним:

  • рекомендации «через 2–3 шага»;
  • соцграф (друзья друзей);
  • зависимости сервисов/цепочек поставок;
  • поиск путей и обходы (traversal).

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

Что такое векторная база данных и когда она реально нужна?

Векторная БД хранит эмбеддинги и ищет ближайшие по расстоянию — это даёт поиск «по смыслу», а не по совпадению слов.

Чаще всего её берут для:

  • RAG (поиск фрагментов для контекста LLM);
  • корпоративного поиска по документам;
  • поиска похожих товаров/обращений;
  • дедупликации и кластеризации.

Важно: качество зависит от модели эмбеддингов и настроек ANN‑индекса, поэтому тестируйте на эталонных запросах (например, precision@k/recall@k).

Где уместно key-value хранилище и почему оно не заменяет «обычную» БД?

Key-value подходит, когда доступ почти всегда по ключу и нужна максимальная скорость:

  • кеш и результаты вычислений;
  • сессии/токены с TTL;
  • счётчики, rate limiting;
  • простые очереди/стримы (в зависимости от движка).

Как «источник истины» key-value используют осторожно: сложные выборки и отчёты там неудобны, а индексы/поиск часто приходится строить вручную или выносить в другую систему.

Что важно понимать про CAP, репликацию и «итоговую согласованность»?

В распределённых системах при сбоях сети приходится выбирать между консистентностью и доступностью (CAP‑идея).

Практический критерий:

  • если хуже «показать старое» (платежи, остатки) — выбирайте более сильную консистентность и кворумы;
  • если хуже «иногда не отвечает» (лента, метрики) — чаще допускают eventual consistency.

Заранее зафиксируйте ожидания в SLA и настройках репликации, чтобы не удивляться задержкам и конфликтам данных.

Как безопасно сочетать несколько хранилищ (polyglot persistence) и не утонуть в сложности?

Частая рабочая схема:

  • SQL/OLTP как источник истины;
  • колоночная БД для аналитики;
  • full-text для поиска по тексту;
  • векторное хранилище для семантики;
  • key-value для кеша.

Чтобы это не превратилось в «зоопарк», заранее определите:

  • как данные синхронизируются (CDC/стриминг/батчи);
  • кто владелец каждого домена;
  • где «источник правды» и какие задержки обновления допустимы.

В качестве ориентира полезен чек‑лист из статьи (см. также /blog/kak-vybrat-bazu-dannyh).

Похожие статьи