Ответ
Я работал с несколькими типами NoSQL баз данных, каждый из которых решает специфические задачи.
1. Документоориентированные БД (MongoDB, CouchDB) Использую когда нужна гибкая схема данных или работа с иерархическими структурами.
MongoDB пример:
// Гибкая схема - документы могут иметь разные поля
db.users.insertMany([
{
name: "John",
email: "john@example.com",
age: 30,
address: {
city: "New York",
zip: "10001"
}
},
{
name: "Alice",
email: "alice@example.com",
// Нет поля age
preferences: {
theme: "dark",
notifications: true
}
}
]);
// Агрегации для аналитики
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: {
_id: "$customer_id",
total: { $sum: "$amount" }
}}
]);
2. Key-Value хранилища (Redis, Memcached) Применяю для кэширования, сессий, очередей и счетчиков.
Redis пример:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// Кэширование
$redis->setex('user:123:profile', 3600, json_encode($userData));
// Очередь задач
$redis->rPush('email_queue', json_encode([
'to' => 'user@example.com',
'subject' => 'Welcome',
'template' => 'welcome_email'
]));
// Счетчик просмотров
$redis->incr('article:456:views');
// Pub/Sub для реального времени
$redis->publish('notifications', json_encode([
'user_id' => 123,
'message' => 'New message received'
]));
3. Колоночные БД (Cassandra, HBase) Использую для аналитики больших данных и временных рядов, где важна горизонтальная масштабируемость.
Cassandra особенности:
- Линейная масштабируемость
- Высокая доступность (нет single point of failure)
- Оптимизирована для записи
- Строгая модель согласованности настраивается
4. Графовые БД (Neo4j, Amazon Neptune) Применяю для социальных сетей, рекомендательных систем, анализа связей.
Neo4j пример (Cypher):
// Поиск друзей друзей
MATCH (user:User {id: 123})-[:FRIEND]->(friend)-[:FRIEND]->(friendOfFriend)
WHERE NOT (user)-[:FRIEND]->(friendOfFriend)
RETURN friendOfFriend.name, COUNT(*) AS mutualFriends
ORDER BY mutualFriends DESC
LIMIT 10;
5. Поисковые движки (Elasticsearch, Solr) Использую для полнотекстового поиска, логов и аналитики.
Elasticsearch пример:
{
"query": {
"bool": {
"must": [
{ "match": { "title": "search query" } },
{ "range": { "date": { "gte": "2024-01-01" } } }
],
"filter": [
{ "term": { "status": "published" } }
]
}
},
"aggs": {
"by_category": {
"terms": { "field": "category.keyword" }
}
}
}
Критерии выбора:
- MongoDB: когда нужна гибкая схема и богатые запросы
- Redis: для кэширования, очередей, реального времени
- Cassandra: для больших объемов данных с высокой записью
- Elasticsearch: для поиска и анализа текста
- Neo4j: для сложных связей и графовых алгоритмов
Важно: NoSQL не заменяет SQL, а дополняет его для специфических use cases. Часто использую комбинацию (например, PostgreSQL как основная БД + Redis для кэша + Elasticsearch для поиска).