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

«Какие NoSQL базы данных вы знаете и в каких случаях их использовать?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я работал с несколькими типами 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 для поиска).