Базы данных без тумана

Какие бывают базы данных

18 мин
Чему научишься
  • отличать пять семейств БД — реляционные, ключ-значение, документные, колоночные, графовые — по способу хранения и типовым задачам
  • выбирать хранилище под характер запросов: реляционная база по умолчанию, Redis/MongoDB/ClickHouse — под конкретную задачу, а не «по моде»
  • объяснять разницу и и зачем продукт пишет в PostgreSQL, а аналитика читает колоночную
  • находить «документную» потребность, которую закрывает столбец jsonb в PostgreSQL без второй базы

По пути к описи КВЕРИ притормаживает у тёмной секции хранилища. За стеклом — реестр архивов старой Земли, не переживших Большой обрыв: кэш-узлы погасли первыми, документные хранилища дошли рваными фрагментами, аналитические кластеры молчат целыми секторами. А реляционный «Котомаркета» уцелел целиком — со всеми связями.

Тёмная галерея погасших архивов старой Земли разных форм; в её конце целиком светится реляционная голограмма из связанных таблиц
Хранилища бывают разными: ключ-значение, документы, колонки. Наш уцелевший снимок — реляционный: таблицы и связи.

Не только реляционные

Для «Котомаркета» нам особенно удобны реляционные БД: покупатели, заказы и товары естественно ложатся в таблицы со связями. Именно им посвящён курс. Но в индустрии — что в 2024-м, что сейчас — встречаются и другие подходы:

  • ключ-значение (Redis) — очень быстрый формат «ключ → значение», когда нужно мгновенно достать простую запись;
  • документоориентированные (MongoDB) — хранят гибкие -документы, где структура может отличаться от записи к записи;
  • колоночные (ClickHouse) — сильны в аналитике, когда нужно быстро считать показатели по огромным объёмам данных.

Большинство популярных для продуктовой разработки остаются реляционными: PostgreSQL, MySQL, Oracle, MS SQL. Освоишь SQL здесь — сможешь уверенно читать данные в очень разных компаниях.

КВЕРИ: Каждому архиву — своя работа: одним скорость, другим гибкость, третьим аналитика. Нам с тобой повезло: нам достался тот, в котором всё связано со всем.

Реестр семейств: разбор по полочкам

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

Реляционные БД: строгая схема и связи

Способ хранения: строки в таблицах с заранее объявленной схемой — у каждого столбца есть тип, между таблицами действуют связи по ключам, и сама охраняет целостность: заказ от несуществующего покупателя записать не выйдет. Изменения исполняются с гарантиями — «заказ + списание остатка» либо записываются вместе, либо не записываются вовсе.

users — таблицаidPKintegerfull_nametextcitytextsignup_datedate123Артём ВолковЕкатерина АлексеевНиколай НикитинСанкт-ПетербургЕкатеринбургАлматы2024-10-202025-01-252024-09-21строки — записи · столбцы — свойства с типом · и таблиц может быть всего одна
Реляционная БД в основе — таблица: строки-записи и столбцы со своим типом. Связи по ключам добавляются поверх, а таблиц может быть даже одна.
usersidnameproductsidtitleordersiduser_idproduct_idFK → PKпродукты · банкинг · заказыPostgreSQL · MySQL
А когда таблиц несколько — они связываются ключами: строгая схема и связи между таблицами.
  • Сильные стороны: выразительный SQL (фильтры, , ), целостность на уровне базы, .
  • Слабые: схему нужно продумывать заранее и мигрировать при изменениях; горизонтальное масштабирование на много серверов даётся труднее, чем -семействам.
  • Продукты: PostgreSQL, MySQL/MariaDB, Microsoft SQL Server, Oracle, SQLite.
  • Когда брать: пользователи, заказы, деньги, склад — везде, где данные связаны и ошибка записи недопустима. Для нового продукта это выбор по умолчанию.

Базы ключ-значение: словарь на максимальной скорости

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

-- Это не SQL, это команды Redis
SET session:8f3a '{"user_id": 42}'
GET session:8f3a
ключзначениеuser:42Анна · Москваcart:42[молоко, сыр]sess:9fактивна до 18:40поиск по ключу — мгновеннокэш · сессии · корзины — Redis
Ключ-значение: мгновенный доступ по точному ключу — и никаких запросов «по содержимому».
  • Сильные стороны: скорость, простота, лёгкое масштабирование.
  • Слабые: запросы только по точному ключу — вопрос «найди все сессии покупателей из Москвы» этому формату не задать; внутренность значения для базы непрозрачна.
  • Продукты: Redis, Memcached, Amazon DynamoDB.
  • Когда брать: кэш, сессии, счётчики, очереди, рейтинги — горячие данные рядом с основной базой, а не вместо неё.

Документные БД: гибкий JSON

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

документ 1документ 2{name: "Мышка",price: 390,tags: ["хит"]}{name: "Корм",brand: "Котэ",specs: {вес: "2 кг"}}поля и вложенность различаются — схема гибкаякаталоги · профили · CMS — MongoDB
Документная модель: гибкие JSON-документы с разным набором полей живут в одной коллекции.
  • Сильные стороны: гибкая структура, документ читается целиком одним обращением, удобно для каталогов с разнородными атрибутами и быстрых прототипов.
  • Слабые: связи между документами — забота приложения, полноценных почти нет; без дисциплины коллекция превращается в зоопарк несовместимых форматов.
  • Продукты: MongoDB, Couchbase, Firestore.
  • Когда брать: контент, каталоги с сильно различающимися полями, профили и настройки.

Граница семейств, кстати, размыта: PostgreSQL умеет хранить документы в столбце типа jsonb и строить по ним — часто это закрывает «документную» потребность без второй базы:

-- Пример вне нашего снимка: attrs — столбец типа jsonb
SELECT name, attrs->>'color' AS color
FROM catalog
WHERE attrs @> '{"brand": "Kotomarket"}';

Колоночные БД: аналитика по миллиардам строк

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

-- Любимый жанр колоночной базы (диалект ClickHouse: toYYYYMM — его функция)
SELECT toYYYYMM(created_at) AS month, avg(total_amount) AS avg_check
FROM orders
GROUP BY month;
колоночное хранение: таблица лежит по столбцамuser_ideventpricets39029905901490990AVG(price): читается только одна колонкааналитика событий · метрики — ClickHouse
Колоночное хранение: агрегат читает с диска только нужные столбцы, а не всю таблицу построчно.
  • Сильные стороны: и сканирование миллиардов строк, сильное сжатие.
  • Слабые: точечные обновления и удаления дороги; прочитать одну строку целиком — медленнее, чем в строчной базе; транзакционная нагрузка — для такой нагрузки они не предназначены.
  • Продукты: ClickHouse, BigQuery, Snowflake, Amazon Redshift.
  • Когда брать: аналитика, отчёты, события, логи, метрики — обычно рядом с «боевой» реляционной базой.

Здесь же пара терминов, которые любят на собеседованиях: (online processing — много коротких операций записи и чтения, мир PostgreSQL) и (online analytical processing — тяжёлые аналитические чтения по всей истории, мир ClickHouse). Продукт пишет в OLTP-базу, аналитика читает OLAP-копию.

И последнее семейство — графовые БД

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

дружитАняБоряВераГлебДинаузлы — записи, рёбра — связи; «друзья друзей» = пройти по двум рёбрам
Граф: кружки-узлы — это записи (например, люди), линии-рёбра — связи между ними. «Друзья друзей» — это просто переход по рёбрам.

Мини-гайд: как выбрать базу под проект

  1. Начни с вопросов, а не с данных. Какие запросы будет задавать продукт: точечные «по ключу», связные «кто что купил», аналитические «сколько за месяц»?
  2. По умолчанию — реляционная. Связанные данные плюс цена ошибки (заказы, оплаты, остатки) — это PostgreSQL. Самый безопасный старт почти для любого продукта.
  3. Специализированные базы — под конкретную задачу, а не «про запас». Жмут горячие чтения — добавь кэш на Redis. Выросла аналитика — реплицируй события в ClickHouse. Дикая вариативность полей — сперва jsonb в PostgreSQL, и лишь когда его не хватит — документная база.
  4. Считай цену второй базы. Каждая новая — это синхронизация данных, бэкапы, мониторинг и ещё одна технология, которую команде поддерживать.

Грабли: выбирать базу «по моде». «Возьмём MongoDB — без схемы быстрее» заканчивается тем, что схему всё равно проектируют, только теперь её правила живут в коде приложения, а не под защитой базы. Обратные грабли тоже встречаются: тащить ClickHouse под объёмы, которые PostgreSQL агрегирует за миллисекунды. Базу подбирают под характер запросов и цену ошибки — не под хайп.

ClickHouse — колоночная для аналитики: её любят за быстрые расчёты по большим таблицам событий и заказов. У неё свой SQL; на платформе есть отдельный тренажёр по ClickHouse. А наш — реляционный: дальше КВЕРИ открывает опись и показывает, из чего он сложен, — таблицы, строки и нити-ключи между ними.

Вопрос с собеседования

Вопрос с собеседования: какие типы баз данных ты знаешь и как выберешь хранилище для нового сервиса?

Сильный ответ: реляционные (PostgreSQL, MySQL) — строгая схема, связи, -; ключ-значение (Redis) — кэш, сессии, счётчики; документные (MongoDB) — гибкие -документы; колоночные (ClickHouse, BigQuery) — аналитика по большим объёмам; графовые (Neo4j) — глубокие связи. В выборе иду от характера запросов: источником истины делаю реляционную базу, специализированные подключаю под конкретную задачу (кэш, аналитика), а не вместо неё.

Дополнительный вопрос: чем отличается от ?

Сильный ответ: OLTP — много коротких транзакций записи и чтения (оформление заказов), строчные вроде PostgreSQL; OLAP — тяжёлые аналитические чтения и по истории, колоночные СУБД вроде ClickHouse. Часто работают парой: продукт пишет в OLTP, аналитика читает OLAP-.

Проверь себя
Какой тип БД обычно выбирают для аналитики больших объёмов данных?