← Назад к вопросам

Приведи пример использования нереляционной БД

2.0 Middle🔥 151 комментариев
#Базы данных (NoSQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

NoSQL БД на практике: Реальные примеры и применение

Нереляционные базы данных — это мощный инструмент, который я использовал во многих проектах. Вот конкретные примеры из реальной практики, когда NoSQL был правильным выбором.

Пример 1: MongoDB для системы логирования событий

В стартапе, где я разрабатывал аналитическую платформу, нам нужно было хранить события пользователей (клики, просмотры, взаимодействия). Структура данных была гибкой и часто менялась.

from pymongo import MongoClient
from datetime import datetime
import json

client = MongoClient('mongodb://localhost:27017')
db = client['analytics']
events_collection = db['user_events']

# Вставка события с динамической структурой
def log_event(user_id, event_type, metadata):
    event = {
        'user_id': user_id,
        'event_type': event_type,
        'timestamp': datetime.utcnow(),
        'metadata': metadata,
        'ip_address': '192.168.1.1',
        'user_agent': 'Mozilla/5.0'
    }
    result = events_collection.insert_one(event)
    return str(result.inserted_id)

# Запрос для аналитики
today_events = events_collection.aggregate([
    {'$match': {'timestamp': {'$gte': datetime(2026, 3, 22)}}},
    {'$group': {'_id': '$user_id', 'event_count': {'$sum': 1}}},
    {'$sort': {'event_count': -1}}
])

Почему MongoDB здесь идеален:

  • Структура событий менялась часто (добавляли новые поля)
  • Быстрая вставка миллионов документов
  • Встроенная агрегация для аналитики
  • Горизонтальная масштабируемость через sharding

Пример 2: Redis для кэша и сессий

В микросервисной архитектуре я использовал Redis не только как кэш, но и как хранилище состояния приложения.

import redis
import json
from typing import Optional

class UserSessionManager:
    def __init__(self, redis_host='localhost', redis_port=6379):
        self.redis = redis.Redis(
            host=redis_host,
            port=redis_port,
            decode_responses=True
        )
    
    def create_session(self, user_id: str, data: dict, ttl: int = 3600):
        session_key = f'session:{user_id}'
        self.redis.setex(session_key, ttl, json.dumps(data))
    
    def get_session(self, user_id: str) -> Optional[dict]:
        session_key = f'session:{user_id}'
        session_data = self.redis.get(session_key)
        return json.loads(session_data) if session_data else None

# Использование
session_mgr = UserSessionManager()
session_mgr.create_session('user_123', {'username': 'john'}, ttl=7200)

Преимущества Redis:

  • Чрезвычайно быстрый доступ (in-memory)
  • Встроенное TTL для автоматической очистки
  • Атомарные операции для счётчиков
  • Простая pub/sub для уведомлений

Пример 3: Elasticsearch для полнотекстового поиска

Когда нам потребовалась функция поиска по документам с фильтрацией, Elasticsearch был идеальным решением.

from elasticsearch import Elasticsearch
from datetime import datetime

es = Elasticsearch(['http://localhost:9200'])

def search_articles(query: str, author_filter: Optional[str] = None):
    search_body = {
        'query': {
            'bool': {
                'must': [{
                    'multi_match': {
                        'query': query,
                        'fields': ['title^2', 'content']
                    }
                }],
                'filter': []
            }
        }
    }
    
    if author_filter:
        search_body['query']['bool']['filter'].append(
            {'term': {'author': author_filter}}
        )
    
    results = es.search(index='articles', body=search_body, size=50)
    return [hit['_source'] for hit in results['hits']['hits']]

Пример 4: Cassandra для time-series данных

В системе мониторинга метрик серверов мы использовали Cassandra для хранения временных рядов.

from cassandra.cluster import Cluster
import time

cluster = Cluster(['127.0.0.1'])
session = cluster.connect('metrics')

def record_metric(server_id: str, metric_name: str, value: float):
    query = '''
        INSERT INTO server_metrics 
        (server_id, timestamp, metric_name, value)
        VALUES (%s, %s, %s, %s)
    '''
    timestamp = int(time.time() * 1000)
    session.execute(query, [server_id, timestamp, metric_name, value])

Сравнение: Когда использовать какую NoSQL

БДИспользуй когдаПример
MongoDBГибкая схема, документыЛогирование, CMS, каталоги
RedisНужна скорость, кэш, сессииСессии, рейтинги, счётчики
ElasticsearchПолнотекстовый поискПоиск по документам
CassandraВременные ряды, масштабируемостьМетрики, IoT

Ключевой вывод

Каждая NoSQL БД решает конкретную проблему, которая неэффективна для реляционных БД. Я выбираю технологию не по популярности, а по требованиям задачи: нужна ли мне скорость, гибкость схемы, масштабируемость, или специализированная функциональность типа полнотекстового поиска.