NodeJS Back-end Инженер

NodeJS Back-end Инженер

Роадмап навыков для прокачки

Что такое NoSQL базы данных?

DatabasesNoSQLdefault

Основная идея

NoSQL (Not Only SQL) — это класс баз данных, которые не используют реляционную модель с таблицами и SQL-запросами. Они предлагают альтернативные модели данных (документы, ключ-значение, графы, колонки) и оптимизированы для горизонтального масштабирования и работы с большими объёмами неструктурированных данных.

Ключевые аспекты

  • Гибкая схема — не требуется фиксированная структура таблиц, документы могут иметь разные поля
  • Горизонтальное масштабирование — легко добавлять новые серверы (шарды) для увеличения производительности
  • Высокая доступность — встроенная репликация и отказоустойчивость
  • Разные модели данных — Key-Value, Document, Column-family, Graph
  • Eventual Consistency — многие NoSQL БД жертвуют строгой согласованностью ради производительности

Плюсы NoSQL

  • Простое горизонтальное масштабирование
  • Гибкая схема данных — легко менять структуру
  • Высокая производительность для определённых сценариев
  • Хорошо подходит для Big Data и real-time приложений

Минусы NoSQL

  • Нет стандартного языка запросов (у каждой БД свой API)
  • Ограниченная поддержка транзакций (ACID)
  • Сложнее выполнять сложные JOIN-запросы
  • Меньше инструментов и специалистов

Частые ошибки на собеседованиях

  • Считают, что NoSQL всегда быстрее SQL — зависит от задачи и модели данных
  • Думают, что NoSQL не поддерживает транзакции — MongoDB 4.0+ поддерживает ACID
  • Путают "schema-less" с "без валидации" — можно добавить валидацию на уровне приложения
  • Не знают CAP-теорему — важно понимать trade-offs между Consistency, Availability, Partition tolerance

Введение и проблематика

Почему появились NoSQL базы данных?

Реляционные базы данных (RDBMS) доминировали десятилетиями, но с ростом интернета и Big Data появились новые требования:

  • Масштабирование — миллионы пользователей, петабайты данных
  • Гибкость — быстро меняющиеся требования к структуре данных
  • Производительность — миллисекундные отклики при высокой нагрузке
  • Доступность — 24/7 без простоев

Традиционные SQL базы данных плохо справляются с горизонтальным масштабированием. NoSQL базы данных были созданы для решения этих проблем.

Термин "NoSQL" появился в 2009 году и означает "Not Only SQL" — не только SQL. Это не отказ от SQL, а расширение возможностей хранения данных.


Базовая теория

Что такое NoSQL?

NoSQL — это общий термин для баз данных, которые:

  1. Не используют реляционную модель (таблицы со строками и столбцами)
  2. Не требуют фиксированной схемы данных
  3. Не используют SQL как основной язык запросов
  4. Оптимизированы для горизонтального масштабирования

Основные характеристики NoSQL

graph TD A[NoSQL характеристики] --> B[Гибкая схема] A --> C[Горизонтальное масштабирование] A --> D[Высокая доступность] A --> E[Распределённая архитектура] B --> B1[Schema-less / Schema-optional] C --> C1[Шардирование] D --> D1[Репликация] E --> E1[CAP теорема]

CAP-теорема

Любая распределённая система может гарантировать только 2 из 3 свойств:

СвойствоОписание
ConsistencyВсе узлы видят одинаковые данные
AvailabilityКаждый запрос получает ответ
Partition toleranceСистема работает при сетевых сбоях
⚠️

NoSQL базы данных обычно выбирают AP (Availability + Partition tolerance), жертвуя строгой согласованностью (Consistency). Это называется "Eventual Consistency".


Типы NoSQL баз данных

Key-Value хранилища

Простейшая модель: ключ → значение (blob).

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

Когда использовать:

  • Кэширование
  • Сессии пользователей
  • Корзины покупок
  • Real-time данные
js
// Redis пример
await redis.set('user:123', JSON.stringify(userData));
const user = await redis.get('user:123');

Практические примеры

Сравнение SQL и NoSQL подхода

Задача: Хранение заказов пользователя

sql
-- Нужны 3 таблицы с JOIN
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100)
);
 
CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  total DECIMAL
);
 
CREATE TABLE order_items (
  id SERIAL PRIMARY KEY,
  order_id INTEGER REFERENCES orders(id),
  product_name VARCHAR(100),
  quantity INTEGER
);
 
-- Запрос с JOIN
SELECT u.name, o.total, oi.product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
WHERE u.id = 123;

SQL vs NoSQL — когда что использовать

КритерийSQLNoSQL
Структура данныхФиксированная схемаГибкая схема
Связи между даннымиМного связей (JOIN)Вложенные документы
ТранзакцииПолная ACID поддержкаОграниченная поддержка
МасштабированиеВертикальноеГоризонтальное
ЗапросыСложные SQL запросыПростые запросы по ключу/полям
СогласованностьStrong consistencyEventual consistency

Когда выбрать SQL:

  • Сложные связи между данными
  • Критичная согласованность (финансы, бухгалтерия)
  • Сложные аналитические запросы
  • Транзакции между несколькими таблицами

Когда выбрать NoSQL:

  • Большие объёмы данных с простой структурой
  • Нужно горизонтальное масштабирование
  • Часто меняющаяся схема данных
  • High availability важнее согласованности

Пограничные кейсы

⚠️

"NoSQL = нет транзакций" — это миф! MongoDB 4.0+ поддерживает multi-document ACID транзакции. Но они медленнее, чем в PostgreSQL.

🚫

Не используйте NoSQL для данных с множеством связей. Если часто нужны JOIN-подобные запросы — выбирайте SQL или Graph DB.

Polyglot Persistence

Современный подход — использовать разные базы данных для разных задач:

text
PostgreSQL  → Основные данные (пользователи, заказы)
Redis       → Кэш и сессии
MongoDB     → Логи и аналитика
Elasticsearch → Полнотекстовый поиск

Популярные NoSQL базы данных

База данныхТипОсобенности
MongoDBDocumentСамая популярная, JSON документы
RedisKey-ValueIn-memory, очень быстрая
CassandraColumn-familyВысокая доступность, линейное масштабирование
Neo4jGraphCypher язык запросов
DynamoDBKey-Value/DocumentAWS managed, serverless
ElasticsearchDocumentПолнотекстовый поиск

Вопросы интервьюера

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

NoSQL не использует реляционную модель и SQL. Предлагает гибкую схему и горизонтальное масштабирование вместо фиксированных таблиц и JOIN.

Q: Что такое Eventual Consistency?

Данные станут согласованными "со временем", но не мгновенно. После записи на одном узле, другие узлы получат обновление с задержкой.

Q: Можно ли использовать NoSQL для банковских транзакций?

Не рекомендуется. Для критичной согласованности лучше SQL с ACID транзакциями. Хотя MongoDB 4.0+ поддерживает ACID.

Q: Почему NoSQL масштабируется лучше SQL?

NoSQL изначально проектировались для шардирования — данные распределяются по нескольким серверам. SQL базы сложнее шардировать из-за JOIN между таблицами.


Источники