← Назад к вопросам
В чем разница между реляционной и нереляцонной БД?
2.2 Middle🔥 183 комментариев
#Архитектура и паттерны
Комментарии (3)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между реляционной и нереляционной базой данных
Что такое реляционная БД (RDBMS)
Реляционная база данных — это структурированное хранилище данных, организованное в таблицы с строками и столбцами. Данные связаны через ключи и следуют строгой схеме.
Примеры: PostgreSQL, MySQL, SQLite, Microsoft SQL Server, Oracle
// Реляционная БД (SQL)
// Таблица USERS
id | name | email | age |
---+-------+-----------------+-----|
1 | John | john@example.com | 30 |
2 | Alice | alice@example.com| 25 |
3 | Bob | bob@example.com | 35 |
// Таблица ORDERS
id | user_id | total | created_at
---+---------+-------+------------
1 | 1 | 100 | 2024-01-15
2 | 2 | 250 | 2024-01-16
3 | 1 | 150 | 2024-01-17
// Связь через FOREIGN KEY
// ORDERS.user_id -> USERS.id
Что такое нереляционная БД (NoSQL)
Нереляционная база данных — это гибкое хранилище данных, которое хранит данные в различных форматах (документы, ключ-значение, графы) без строгой схемы.
Примеры: MongoDB, Redis, Cassandra, Firebase, DynamoDB, Elasticsearch
// Нереляционная БД (NoSQL)
// MongoDB — документы в JSON
db.users.insertOne({
_id: ObjectId("..."),
name: "John",
email: "john@example.com",
age: 30,
address: {
city: "New York",
zip: "10001"
},
orders: [
{ id: 1, total: 100 },
{ id: 2, total: 150 }
]
});
// Redis — ключ-значение пары
SET user:1:name "John"
SET user:1:email "john@example.com"
SET user:1:age "30"
Ключевые отличия
1. Структура данных
// РЕЛЯЦИОННАЯ БД: таблицы с фиксированной схемой
// Схема
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
age INT,
created_at TIMESTAMP
);
// Все строки имеют ОДИНАКОВУЮ структуру
// Добавить новое поле = изменить таблицу для всех
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
// НЕРЕЛЯЦИОННАЯ БД: гибкие документы
// Нет схемы, документы могут быть разными
db.users.insertOne({
name: "John",
email: "john@example.com"
});
db.users.insertOne({
name: "Alice",
email: "alice@example.com",
phone: "+1234567890",
address: { city: "NYC" } // Дополнительное поле!
});
db.users.insertOne({
name: "Bob",
email: "bob@example.com",
preferences: { theme: "dark" } // Совсем другие поля!
});
// Каждый документ может иметь свою структуру
2. Связи между данными
// РЕЛЯЦИОННАЯ БД: связи через FOREIGN KEY
// Таблица USERS
id | name | email
---+------+----------
1 | John | john@...
2 | Alice| alice@...
// Таблица ORDERS
id | user_id | total
---+---------+------
1 | 1 | 100
2 | 1 | 150
3 | 2 | 200
// SQL запрос для получения заказов пользователя
SELECT o.* FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.name = 'John';
// НЕРЕЛЯЦИОННАЯ БД: встроенные (nested) документы
db.users.insertOne({
_id: 1,
name: "John",
email: "john@example.com",
orders: [ // Заказы прямо в документе
{ id: 1, total: 100 },
{ id: 2, total: 150 }
]
});
// Запрос
db.users.find({ name: "John" });
// Сразу получаешь заказы, не нужен JOIN
3. Масштабируемость
// РЕЛЯЦИОННАЯ БД: вертикальное масштабирование
// Добавляешь больше памяти/CPU одному серверу
// Хорошо для: читаемости, целостности данных
// Плохо для: очень больших данных (сложно масштабировать горизонтально)
// Примеры:
// PostgreSQL обычно на одном сервере
// Репликация есть, но шардинг сложнее
// НЕРЕЛЯЦИОННАЯ БД: горизонтальное масштабирование
// Разделяешь данные на несколько серверов (шардинг)
// MongoDB: данные разделены по key диапазонам
// Redis: данные разделены по ключам
// Cassandra: распределённая система из коробки
// Хорошо для: огромных объёмов данных
// Плохо для: сложных запросов (JOIN невозможны)
4. ACID vs BASE
// РЕЛЯЦИОННАЯ БД: ACID гарантии
// A — Atomicity (атомарность)
// Транзакция либо полностью выполнится, либо не выполнится
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
COMMIT; // Либо оба UPDATE, либо ни один
// C — Consistency (консистентность)
// БД всегда в корректном состоянии
// Схема гарантирует правильность данных
// I — Isolation (изоляция)
// Одновременные транзакции не мешают друг другу
TRANSACTION 1: SELECT balance FROM users WHERE id = 1; -- 1000
TRANSACTION 2: UPDATE users SET balance = 500 WHERE id = 1;
TRANSACTION 1: SELECT balance FROM users WHERE id = 1; -- 500 (видит изменения)
// D — Durability (долговечность)
// Сохранённые данные не теряются даже при сбое
// НЕРЕЛЯЦИОННАЯ БД: BASE гарантии
// B — Basically Available (в основном доступна)
// А не всегда доступна, может быть временно недоступна
// A — Soft state (мягкое состояние)
// Состояние может изменяться без input'а
// E — Eventually consistent (в конце концов консистентна)
// Данные согласуются в конце, но не сразу
// Пример: MongoDB без ACID (раньше)
db.users.insertOne({ id: 1, balance: 1000 });
db.orders.insertOne({ user_id: 1, amount: 100 });
// Если сбой между этими двумя — несогласованность!
// (Современный MongoDB поддерживает многодокументные ACID транзакции)
5. Тип запросов
// РЕЛЯЦИОННАЯ БД: SQL
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.age > 25
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 2
ORDER BY order_count DESC;
// Мощный, гибкий язык запросов
// Можно писать очень сложные аналитические запросы
// НЕРЕЛЯЦИОННАЯ БД: разные синтаксисы
// MongoDB
db.users.aggregate([
{ $match: { age: { $gt: 25 } } },
{ $lookup: {
from: "orders",
localField: "_id",
foreignField: "user_id",
as: "orders"
}},
{ $addFields: { order_count: { $size: "$orders" } } },
{ $match: { order_count: { $gt: 2 } } },
{ $sort: { order_count: -1 } }
]);
// Redis
GET user:1:name
GET user:1:balance
// Всё очень просто, но и менее мощно
Сравнительная таблица
┌─────────────────────┬──────────────────┬──────────────────┐
│ Характеристика │ Реляционная БД │ Нереляционная БД │
├─────────────────────┼──────────────────┼──────────────────┤
│ Структура │ Таблицы │ Документы/ключи │
│ Схема │ Строгая │ Гибкая/нет │
│ Связи │ FOREIGN KEY JOIN │ Встроенные │
│ Масштабируемость │ Вертикальная │ Горизонтальная │
│ Транзакции │ ACID │ BASE │
│ Язык запросов │ SQL │ Разные │
│ Объём данных │ Средний │ Огромный │
│ Скорость запросов │ Средняя │ Высокая │
│ Сложность │ Средняя │ Низкая │
│ Консистентность │ Гарантированная │ Спорадическая │
└─────────────────────┴──────────────────┴──────────────────┘
Когда использовать что
// ИСПОЛЬЗУЙ РЕЛЯЦИОННУЮ БД КОГДА:
// + Данные структурированы и имеют правильную схему
// + Нужны сложные связи между таблицами
// + Нужны ACID гарантии (финансовые операции)
// + Нужны аналитические запросы
// + Данные изменяются редко
// Примеры: банки, соцсети, CRM, e-commerce
const productionDB = {
users: "PostgreSQL", // Профили пользователей
products: "PostgreSQL", // Товары
orders: "PostgreSQL", // Заказы (нужна целостность!)
transactions: "PostgreSQL" // Платежи (ACID критичен!)
};
// ИСПОЛЬЗУЙ НЕРЕЛЯЦИОННУЮ БД КОГДА:
// + Данные не структурированы или часто меняют структуру
// + Нужна высокая скорость на больших объёмах
// + Нужна горизонтальная масштабируемость
// + Данные часто меняются
// + Нужна гибкость (документы разной структуры)
// Примеры: логирование, реал-тайм данные, кэш, analytics
const productionDB = {
userCache: "Redis", // Быстрый доступ
analytics: "MongoDB", // Много разных метрик
logs: "Elasticsearch", // Полнотекстовый поиск
socialFeed: "Cassandra", // Много данных, много чтений
sessionStore: "Redis" // Временные данные
};
Практический пример: e-commerce приложение
// РЕЛЯЦИОННАЯ БД (PostgreSQL)
// users — структурированные данные, редко меняются
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
// orders — критичная целостность данных (ACID)
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
total DECIMAL(10,2),
status VARCHAR(50),
created_at TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
// НЕРЕЛЯЦИОННАЯ БД (MongoDB)
// productReviews — много текста, разная структура
db.productReviews.insertOne({
product_id: 123,
user_id: 456,
rating: 4,
text: "Great product!",
images: ["url1", "url2"],
metadata: { /* разное */ }
});
// КЭШ (Redis)
// Быстрое получение часто запрашиваемых данных
SET user:123:profile json-данные пользователя
EXPIRE user:123:profile 3600 // 1 час
GET user:123:profile
// ЛОГИРОВАНИЕ И АНАЛИТИКА (Elasticsearch)
// Огромный объём логов, полнотекстовый поиск
POST /logs/_doc
{
"timestamp": "2024-01-15T10:30:00Z",
"event": "user_login",
"user_id": 123,
"ip": "192.168.1.1",
"user_agent": "..."
}
Итог
Реляционная БД:
- Структурированные таблицы
- Строгая схема
- ACID гарантии
- Сложные запросы
- Вертикальное масштабирование
- Лучше для: финансовые данные, правильные данные
Нереляционная БД:
- Гибкие документы/ключи
- Нет схемы
- BASE гарантии
- Простые запросы
- Горизонтальное масштабирование
- Лучше для: большие объёмы, быстрые операции, разная структура
В реальных приложениях часто используют ОБОИХ: PostgreSQL для основных данных, Redis для кэша, MongoDB для логов.