🙏 Нам нужна ваша помощь! SQLtest.online без рекламы и живёт только на донаты. Даже небольшая сумма помогает. Поддержать →
SQL код скопирован в буфер обмена

Типы баз данных: реляционные, NoSQL и другие модели

Урок 1.2 · Время чтения: ~20 мин · Задачи для практики ↓

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

В предыдущем уроке мы познакомились с общей идеей базы данных и СУБД. На практике не все базы данных устроены одинаково. Разные типы БД оптимизированы под разные виды данных, шаблоны запросов, требования к масштабируемости и потребности в согласованности.

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

Типы баз данных: один заказ в реляционной таблице и в JSON-документе, базы ключ-значение, широкостолбцовые, графовые и в памяти, колоночные аналитические базы и базы временных рядов

Почему существуют разные типы баз данных?

Ни одна модель базы данных не является идеальной для всех приложений.

Например:

  • Банковской системе необходимы высокая согласованность и надёжные транзакции.
  • Системе кэширования нужен чрезвычайно быстрый поиск по ключу.
  • Социальная сеть может нуждаться в гибком документном хранилище и анализе связей в стиле графов.
  • Аналитической платформе может потребоваться эффективно обрабатывать миллиарды значений для отчётности.

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

Основные типы баз данных: сравнительная таблица

Краткое сравнение перед подробным разбором каждого типа:

ТипМодель данныхСильные стороныТипичные сценарииПримеры
РеляционныеТаблицы со строками и столбцамиВысокая согласованность, SQL, соединения, структурированные данныеБанковские системы, ERP, CRM, e-commerce, отчётностьPostgreSQL, MySQL, MariaDB, SQLite, Oracle
Ключ-значениеКлюч + значениеОчень быстрый поиск, простое масштабированиеКэширование, сессии, feature flags, корзины покупокRedis, Amazon DynamoDB, Riak
ДокументныеДокументы в формате JSONГибкая схема, вложенные данныеУправление контентом, профили пользователей, каталогиMongoDB, Couchbase, Firestore
ШирокостолбцовыеСтроки с гибкими столбцами по семействамВысокая пропускная способность записи, горизонтальное масштабированиеЖурналы событий, IoT, крупные распределённые нагрузкиApache Cassandra, HBase, ScyllaDB
ГрафовыеУзлы и рёбраЗапросы по связямСоциальные сети, обнаружение мошенничества, рекомендацииNeo4j, Amazon Neptune, ArangoDB
Временных рядовЗаписи с временными меткамиЭффективная загрузка и агрегация по времениМониторинг, метрики, датчики, финансовые тикиInfluxDB, TimescaleDB, OpenTSDB
Колоночные аналитическиеДанные хранятся по столбцамБыстрое аналитическое сканирование и агрегацияBI, дашборды, хранилища данных, OLAPClickHouse, DuckDB, Amazon Redshift, BigQuery
В памятиДанные преимущественно в RAMСверхнизкая задержкаКэширование, таблицы лидеров, счётчики реального времениRedis, Memcached, SAP HANA

Реляционные базы данных

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

Эта модель особенно хорошо подходит, когда данные хорошо структурированы и важны точность, согласованность и сложные запросы.

Пример данных

Во всех примерах этого урока используются одни и те же данные интернет-магазина: покупатель Ann (id 42) и заказы этого покупателя. В реляционной базе покупатели и заказы хранятся в двух таблицах, связанных столбцом customer_id:

customers

idnamecity
42AnnLisbon
43BobMadrid

orders

idcustomer_idorder_datetotal
1422026-03-1499.50
2422026-04-0215.00
3432026-04-0212.00

Значение 42 в orders.customer_id указывает на строку Ann в customers: данные покупателя хранятся один раз, а каждый заказ на них ссылается.

Основные свойства реляционных баз данных

1. Структурированная схема

Реляционные БД обычно требуют чётко определённой схемы. Перед сохранением данных задаются таблицы, столбцы, типы данных, ограничения и связи. Это делает структуру предсказуемой и удобной для проверки.

2. Связи между таблицами

Одна из главных сильных сторон реляционных систем - возможность явно моделировать связи между сущностями.

Например:

  • Таблица customers может быть связана с таблицей orders.
  • Таблица orders - с таблицей order_items.

3. Поддержка SQL

Реляционные БД запрашиваются с помощью SQL (Structured Query Language) - стандартного языка для фильтрации, соединения, агрегации, сортировки и изменения структурированных данных.

4. ACID-транзакции

Реляционные БД хорошо известны поддержкой свойств ACID:

  • Атомарность: транзакция либо полностью выполняется, либо полностью откатывается.
  • Согласованность: данные остаются корректными согласно заданным правилам.
  • Изолированность: параллельные транзакции не влияют некорректно друг на друга.
  • Долговечность: после фиксации данные сохраняются даже после сбоев.

Эти свойства критически важны в банковских системах, биллинге, бронировании и управлении запасами.

5. Ограничения целостности данных

Реляционные БД могут применять правила на уровне базы: первичные ключи, внешние ключи, ограничения уникальности, NOT NULL, CHECK. Это предотвращает некорректные или несогласованные данные.

6. Мощные соединения и отчётность

Реляционные БД отлично подходят для объединения информации из нескольких таблиц - именно поэтому они остаются центральными для отчётности, аналитики и финансовых систем.

7. Нормализация и снижение избыточности

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

Типичные сценарии использования реляционных БД

Реляционные базы данных - лучший выбор, когда:

  • данные структурированы и чётко определены
  • связи между сущностями важны
  • транзакции должны быть надёжными
  • согласованность важнее гибкости схемы
  • приложению нужны сложные запросы и отчётность

Примеры реляционных баз данных

  • PostgreSQL: Мощная open-source СУБД с расширенными возможностями.
  • MySQL: Популярная СУБД для веб-приложений.
  • MariaDB: Форк MySQL, развиваемый сообществом.
  • SQLite: Лёгкая встроенная СУБД, хранящаяся в одном файле.
  • Oracle Database: СУБД корпоративного уровня.
  • Microsoft SQL Server: СУБД для корпоративных сред.

Базы данных типа ключ-значение

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

Пример данных

Каждое значение находится по своему ключу. Внутрь значения база не заглядывает: JSON ниже для неё - просто строка.

КлючЗначение
session:8f3a2c{ "customer_id": 42, "expires": "2026-03-14T12:00:00Z" }
cart:42[101, 205]
views:product:1011532
feature:new_checkouton

Ключам вроде session:8f3a2c обычно задают срок жизни, например один час, после которого они удаляются автоматически. Зато на вопрос «найди все сессии покупателя 42» база ответить не может: значение находится, только если ключ уже известен.

Ключевые особенности

  • Доступ по одному ключу, а не через сложные соединения.
  • База не понимает внутреннюю структуру значения.
  • Оптимизированы для сверхбыстрых чтений и записей.

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

  • кэширование результатов запросов
  • хранение пользовательских сессий
  • корзины покупок
  • feature flags, rate limiting
  • таблицы лидеров и счётчики

Примеры: Redis, Amazon DynamoDB, Riak

Документные базы данных

Документные БД хранят данные в виде документов в формате, похожем на JSON. Каждый документ может содержать поля, массивы и вложенные объекты. Структура документов может различаться.

Пример данных

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

{
  "_id": 1,
  "order_date": "2026-03-14",
  "customer": { "id": 42, "name": "Ann", "city": "Lisbon" },
  "items": [
    { "product": "Keyboard", "qty": 1, "price": 79.50 },
    { "product": "Mouse pad", "qty": 2, "price": 10.00 }
  ],
  "total": 99.50
}

Другой документ в той же коллекции может иметь другие поля - например, у подарочного заказа есть gift_message:

{
  "_id": 2,
  "order_date": "2026-04-02",
  "customer": { "id": 42, "name": "Ann" },
  "items": [ { "product": "Gift card", "qty": 1, "price": 15.00 } ],
  "gift_message": "Happy birthday!",
  "total": 15.00
}

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

Ключевые особенности

  • Гибкая или полугибкая схема.
  • Связанные данные часто хранятся вместе в одном документе.
  • Удобны для приложений с часто меняющейся структурой.

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

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

Примеры: MongoDB, Couchbase, Google Firestore

Широкостолбцовые базы данных

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

Пример данных

Строки находятся по ключу строки (row key), и каждая строка хранит только те столбцы, которые у неё действительно есть. Столбцы сгруппированы в семейства (здесь info и orders, имя записывается как family:column), а новые столбцы можно добавить в отдельную строку без изменения схемы:

customer:42
    info:name    = Ann
    info:city    = Lisbon
    orders:1     = 99.50
    orders:2     = 15.00
customer:43
    info:name    = Bob
    orders:3     = 12.00

В строке Bob столбца city нет вообще: это не NULL, его просто не существует. Строка Ann получает новый столбец с каждым заказом. Ключ строки определяет, на каком сервере она хранится, поэтому данные ищут именно по нему; чтобы находить заказы по total, понадобилась бы отдельная таблица, организованная по этому значению.

Ключевые особенности

  • Схема гибче, чем в реляционных БД.
  • Оптимизированы для крупномасштабного распределённого хранения.
  • Хорошо справляются с огромными объёмами данных и интенсивной записью.

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

  • журналирование событий, IoT-телеметрия
  • системы сообщений с интенсивной записью
  • географически распределённые системы

Примеры: Apache Cassandra, Apache HBase, ScyllaDB

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

Пример данных

Возьмём таблицу orders из реляционного примера. Строковая база записывает каждую строку целиком, колоночная - каждый столбец целиком:

Хранение по строкам:
[1, 42, 2026-03-14, 99.50] [2, 42, 2026-04-02, 15.00] [3, 43, 2026-04-02, 12.00]

Хранение по столбцам:
id:          1, 2, 3
customer_id: 42, 42, 43
order_date:  2026-03-14, 2026-04-02, 2026-04-02
total:       99.50, 15.00, 12.00

Отчёту о выручке по датам нужны только order_date и total: колоночная база прочитает лишь эти два столбца и пропустит остальные. Когда столбцов сотни, а строк миллиарды, экономия огромна. К тому же повторяющиеся значения в столбце (как 2026-04-02) хорошо сжимаются.

Колоночная БД хранит на диске значения одного столбца вместе, а не полную строку - это отличается от широкостолбцовой модели. Особенно эффективна для аналитических запросов, читающих несколько столбцов из очень большого набора данных.

Ключевые особенности

  • Оптимизированы для сканирования и агрегации больших объёмов.
  • Высокоэффективны для отчётности и аналитики.
  • Хуже подходят для транзакционных нагрузок с частыми обновлениями строк.

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

  • business intelligence, дашборды
  • хранилища данных и OLAP
  • аналитика логов в большом масштабе

Примеры: ClickHouse, DuckDB, Amazon Redshift, Google BigQuery

Графовые базы данных

Графовые БД предназначены для данных, где связи - самая важная часть модели. Хранят узлы (сущности) и рёбра (связи).

Пример данных

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

(Ann:Customer)-[:PLACED]->(Order 1 { total: 99.50 })-[:CONTAINS]->(Mouse pad:Product)
(Ann:Customer)-[:PLACED]->(Order 1 { total: 99.50 })-[:CONTAINS]->(Keyboard:Product)
(Bob:Customer)-[:PLACED]->(Order 3 { total: 12.00 })-[:CONTAINS]->(Mouse pad:Product)
(Bob:Customer)-[:FOLLOWS]->(Ann:Customer)

Чтобы найти, кто покупал те же товары, что и Ann, база просто идёт по рёбрам: Ann → Order 1 → Mouse pad → Order 3 → Bob. В реляционной базе для того же вопроса пришлось бы объединять несколько таблиц.

Ключевые особенности

  • Обход связей быстр и естественен.
  • Идеальны для запросов по путям, сетям и связанным данным.
  • Лучше реляционных БД справляются с запросами по цепочкам связей.

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

  • социальные сети, обнаружение мошенничества
  • рекомендательные системы, графы знаний

Примеры: Neo4j, Amazon Neptune, ArangoDB

Базы данных временных рядов

Специализированы для данных, связанных со временем. Оптимизированы для высокой скорости загрузки, политик хранения, сжатия и агрегации по временным окнам.

Пример данных

Заказы сюда подходят плохо: типичные данные - это поток измерений. Например, серверы интернет-магазина каждую минуту отправляют метрики:

timehostcpu_percentrequests_per_sec
2026-03-14 10:00:00web-0137.5120
2026-03-14 10:00:00web-0241.2134
2026-03-14 10:01:00web-0139.0126
2026-03-14 10:01:00web-0244.8141

Строки только добавляются и почти никогда не изменяются. Типичные вопросы касаются временных окон: например, средняя загрузка процессора каждого сервера по 5-минутным интервалам за последний час. База также умеет автоматически удалять или сжимать старые данные: например, хранить исходные точки 30 дней, а дальше - только средние значения за час.

Ключевые особенности

  • Каждая запись содержит временную метку.
  • Запросы часто сосредоточены на диапазонах: последний час, день, месяц.

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

  • мониторинг серверов и приложений
  • IoT-датчики, биржевые данные

Примеры: InfluxDB, TimescaleDB, OpenTSDB

Базы данных в памяти

Хранят большую часть или все данные в RAM, а не на диске. Это обеспечивает сверхнизкую задержку, хотя память дороже дискового хранилища.

Пример данных

Redis держит в оперативной памяти структуры данных, например сортированное множество (sorted set). Здесь в нём хранится рейтинг покупателей по сумме покупок: каждый новый заказ увеличивает счёт покупателя, а множество всегда остаётся упорядоченным:

top_customers
    customer:42    114.5
    customer:43    12

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

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

  • кэширование, хранение сессий
  • счётчики реального времени, игровые таблицы лидеров

Примеры: Redis, Memcached, SAP HANA


Как выбрать подходящий тип базы данных

При выборе БД задайте себе эти вопросы:

  • Данные строго структурированы или гибкие?
  • Нужны ли строгие ACID-транзакции?
  • Будут ли сложные соединения таблиц?
  • Является ли быстрый поиск по ключу главным приоритетом?
  • Нагрузка транзакционная или аналитическая?
  • Будет ли система масштабироваться на множество серверов?
  • Связи между сущностями - центральная часть приложения?

Во многих реальных системах используется более одного типа БД:

  • реляционная БД - для основных бизнес-данных
  • Redis - для кэширования
  • документная БД - для гибкого контента
  • колоночное хранилище - для аналитики

Такой подход называют polyglot persistence (полиглотная персистентность).

Краткое резюме: ключевые различия между типами БД

КритерийЧто сравнивается
Модель данныхТаблицы, документы, ключ-значение, графы, временны́е ряды
Гибкость схемыФиксированная или гибкая структура
Стиль запросовSQL, поиск по ключу, документные запросы, обход графов
Модель согласованностиСтрогие ACID-гарантии или масштабируемость
Профиль производительностиТранзакции, аналитика, связи или сверхбыстрый доступ

Ключевые выводы:

  • Разные типы БД существуют потому, что разные приложения имеют разные технические и бизнес-требования.
  • Реляционные БД - лучший выбор для структурированных данных со связями, ACID-транзакциями и SQL.
  • Ключ-значение - для быстрого поиска и кэширования.
  • Документные - когда структура данных гибкая или часто меняется.
  • Широкостолбцовые - для распределённых, крупномасштабных нагрузок с интенсивной записью.
  • Колоночные аналитические - для отчётности и аналитики в большом масштабе.
  • Графовые - для данных, богатых связями.
  • Временных рядов - для метрик и событий, привязанных ко времени.
  • Многие современные системы используют несколько типов БД одновременно.

Часто задаваемые вопросы

В чём разница между реляционными и NoSQL базами данных?

Реляционные БД используют фиксированную табличную схему, обеспечивают ACID-транзакции и запрашиваются через SQL. NoSQL - зонтичный термин для ключ-значение, документных, широкостолбцовых и графовых моделей: они жертвуют частью гарантий согласованности ради гибкости схемы или горизонтального масштабирования. Правильный выбор зависит от данных и нагрузки.

Когда использовать документную БД вместо реляционной?

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

Может ли одно приложение использовать несколько типов БД?

Да - это называется polyglot persistence. Типичный пример: PostgreSQL для транзакционных данных, Redis для кэширования, ClickHouse для аналитики. Каждый тип БД используется там, где он показывает лучшую производительность.

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

Какой тип базы данных вы выберете для конкретного сценария и почему?

Начните с требований к нагрузке: структура данных, требования к согласованности, тип запросов, целевая задержка и масштаб. Например, реляционная БД подходит для ACID-транзакций, документная БД - для гибких JSON-подобных структур, а БД временных рядов - для метрик с временными метками.

Какие плюсы и минусы у одного типа БД по сравнению с другим?

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

Можно ли использовать разные типы баз данных в одном приложении?

Да. Это называется polyglot persistence: в одной системе используются несколько БД, каждая под свой профиль нагрузки. Типичный вариант: PostgreSQL для транзакций, Redis для кэширования и ClickHouse (или другое колоночное хранилище) для аналитики.

Попробуйте решить следующие задачи, чтобы закрепить материал этого урока.

Теоретические вопросы

  1. Что такое RDBMS?
  2. Переводы между счетами
  3. Метрики тысячи серверов