Ответ
Да, работал с различными типами NoSQL СУБД, каждая для своих сценариев.
1. Документные (MongoDB): Использовал для хранения JSON-документов с динамической схемой, например, профилей пользователей или контента каталога.
-- Пример агрегации в MongoDB (аналог GROUP BY + HAVING)
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$customerId", totalSpent: { $sum: "$amount" } } },
{ $match: { totalSpent: { $gt: 1000 } } }
])
Плюсы: Гибкость, вложенные структуры. Минусы: Сложные транзакции (появились в 4.0), производительность JOIN через $lookup.
2. Колоночные (Cassandra): Применял для временных рядов и событийных данных, где важна высокая скорость записи и горизонтальное масштабирование.
- Ключевая концепция: Модель данных строится вокруг запросов (Query-Driven Design). Первичный ключ = Partition Key + Clustering Key.
- Почему не SQL? Отсутствие JOIN и сложных агрегаций компенсируется предрасчитанными материализованными представлениями (Materialized Views).
3. Ключ-значение (Redis): Для кэширования сессий, результатов тяжелых запросов и очередей (через списки/публикации).
Критерии выбора:
- Схема данных: Жесткая (SQL) vs. гибкая/отсутствует (NoSQL).
- Масштабирование: Вертикальное (SQL) vs. горизонтальное (NoSQL).
- Шаблон доступа: Чтение/запись по ключу, агрегации, сложные связи.
- Консистентность: Требуется строгая ACID или достаточно eventual consistency (CAP-теорема).