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

Какие есть БД кроме SQL?

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

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

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

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

Базы данных кроме SQL (NoSQL)

SQL базы данные доминировали 30+ лет, но NoSQL явились альтернативой для специфических задач. Разберу основные типы и их применение.

1. Document Stores (Документные БД)

Хранят данные в формате документов (JSON/BSON).

MongoDB:

from pymongo import MongoClient

client = MongoClient('mongodb://localhost:27017/')
db = client['myapp']
users = db['users']

# Вставка документа
user_doc = {"name": "John", "age": 30, "email": "john@example.com"}
result = users.insert_one(user_doc)

# Поиск
found = users.find_one({"name": "John"})
found_all = users.find({"age": {"$gte": 25}})

# Обновление
users.update_one({"name": "John"}, {"$set": {"age": 31}})

# Удаление
users.delete_one({"name": "John"})

Когда использовать MongoDB:

  • Гибкая схема данных
  • Много полей с разными типами
  • Быстрое прототипирование
  • Вложенные данные (массивы, объекты)

Альтернативы: CouchDB, Firebase Firestore

2. Key-Value Stores (Хранилища ключ-значение)

Амортизированные поиски по ключу за O(1).

Redis:

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# Простые значения
r.set('user:1:name', 'John')
name = r.get('user:1:name')  # 'John'

# Списки (очереди)
r.lpush('tasks', 'task1', 'task2')
r.rpop('tasks')  # Очередь FIFO

# Хеши (словари)
r.hset('user:1', mapping={"name": "John", "age": 30})
r.hget('user:1', 'name')  # 'John'

# Множества
r.sadd('tags', 'python', 'django', 'rest')
r.smembers('tags')  # {'python', 'django', 'rest'}

# Сортированные множества (по score)
r.zadd('leaderboard', {'player1': 100, 'player2': 50})
r.zrange('leaderboard', 0, -1, withscores=True)

# Expire (TTL)
r.setex('temp_token', 3600, 'abc123')  # Удалится через час

Когда использовать Redis:

  • Кеширование (очень быстро)
  • Сессии пользователей
  • Реал-тайм счетчики
  • Очереди задач (Celery использует Redis)
  • Pub/Sub сообщения
  • Лидерборды (leaderboards)

Альтернативы: Memcached (простой кеш), DynamoDB (AWS)

3. Time Series Databases (Временные ряды)

Оптимизированы для хранения данных по времени.

InfluxDB:

from influxdb import InfluxDBClient

client = InfluxDBClient(host='localhost', port=8086)
client.switch_database('myapp')

# Запись метрик
json_body = [
    {
        "measurement": "cpu_load",
        "tags": {"host": "server01"},
        "fields": {"value": 0.64},
        "time": "2024-01-01T00:00:00Z"
    }
]
client.write_points(json_body)

# Запрос
result = client.query('SELECT "value" FROM "cpu_load" WHERE time > now() - 1h')

Когда использовать:

  • Мониторинг (CPU, память, диск)
  • Аналитика (клики, просмотры)
  • IoT датчики
  • Биржевые котировки

Альтернативы: Prometheus, TimescaleDB (PostgreSQL extension)

4. Graph Databases (Графовые БД)

Оптимизированы для работы с связями между данными.

Neo4j:

from neo4j import GraphDatabase

driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))

def create_relationships(tx):
    tx.run(
        "CREATE (a:Person {name: $name, age: $age}) "
        "CREATE (b:Person {name: $name2}) "
        "CREATE (a)-[:KNOWS]->(b)",
        name="Alice", age=30, name2="Bob"
    )

with driver.session() as session:
    session.write_transaction(create_relationships)

# Поиск кратчайшего пути
def find_path(tx):
    result = tx.run(
        "MATCH (a:Person {name: $name})-[*1..3]-(b:Person {name: $target}) "
        "RETURN a, b",
        name="Alice", target="Bob"
    )
    return result

Когда использовать:

  • Социальные сети (друзья, подписки)
  • Рекомендательные системы
  • Паттерны мошенничества
  • Деревья иерархий

5. Search Engines (Поисковые системы)

Полнотекстовый поиск и аналитика.

Elasticsearch:

from elasticsearch import Elasticsearch

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

# Индексирование документа
doc = {
    "title": "Python Tips",
    "author": "John Doe",
    "content": "Python is awesome"
}
es.index(index="blog", id=1, body=doc)

# Поиск
results = es.search(index="blog", body={
    "query": {
        "match": {"content": "Python"}
    }
})

for hit in results['hits']['hits']:
    print(hit['_source'])

Когда использовать:

  • Полнотекстовый поиск
  • Логи приложений (ELK stack)
  • Аналитика событий
  • Автозаполнение (autocomplete)

Альтернативы: Solr, Meilisearch, Algolia (SaaS)

6. Column-oriented Stores (Колончатые БД)

Оптимизированы для аналитических запросов (OLAP).

ClickHouse:

from clickhouse_driver import Client

client = Client('localhost')

# Вставка данных
client.execute(
    'INSERT INTO table_name (id, name) VALUES',
    [(1, 'John'), (2, 'Jane')]
)

# Аналитический запрос
result = client.execute(
    'SELECT COUNT(*), AVG(age) FROM users GROUP BY country'
)

Когда использовать:

  • Data Warehouse
  • OLAP аналитика
  • Мегатонны данных (петабайты)
  • Аналитические запросы (много строк, мало колонок)

7. Vector Databases (Векторные БД)

Для работы с векторными эмбеддингами (AI/ML).

Pinecone / Weaviate:

import pinecone

pinecone.init(api_key="your-api-key", environment="us-west1-gcp")
index = pinecone.Index("embeddings")

# Сохранение вектора
index.upsert([
    {"id": "1", "values": [0.1, 0.2, 0.3], "metadata": {"text": "Hello"}}
])

# Поиск похожих
results = index.query(
    vector=[0.1, 0.2, 0.3],
    top_k=10,
    include_metadata=True
)

Когда использовать:

  • Semantic search (семантический поиск)
  • Recommendation engines с AI
  • Chatbots (RAG)
  • Similarity matching

Сравнительная таблица

Тип БД              | Когда использовать                | Примеры
--------------------|-----------------------------------|------------------
SQL (Relational)    | Структурированные данные, ACID   | PostgreSQL, MySQL
Document Store      | Гибкая схема, вложенные данные  | MongoDB, CouchDB
Key-Value           | Кеширование, сессии, очереди    | Redis, Memcached
Time Series         | Метрики, мониторинг              | InfluxDB, Prometheus
Graph               | Связи между сущностями          | Neo4j
Search Engines      | Полнотекстовый поиск             | Elasticsearch
Column-oriented     | Аналитика больших объемов       | ClickHouse, BigQuery
Vector              | AI/ML, семантический поиск      | Pinecone, Weaviate

Когда выбирать NoSQL

Выбирай SQL если:

  • Данные структурированы
  • Нужны ACID гарантии
  • Много JOIN'ов
  • Нужны сложные запросы
  • Данные нормализованы

Выбирай NoSQL если:

  • Быстрое масштабирование (шардирование)
  • Гибкая схема
  • Данные денормализованы
  • Высокая скорость чтения
  • Специфический usecase (поиск, графы и т.д.)

Практический пример: полнофункциональное приложение

# PostgreSQL для основных данных (ACID, транзакции)
from sqlalchemy import create_engine

# Redis для кеша и сессий
from redis import Redis

# Elasticsearch для полнотекстового поиска
from elasticsearch import Elasticsearch

# InfluxDB для метрик
from influxdb import InfluxDBClient

class UserService:
    def __init__(self):
        self.db = create_engine('postgresql://...')
        self.redis = Redis()
        self.es = Elasticsearch()
        self.metrics = InfluxDBClient()
    
    def get_user(self, user_id):
        # 1. Проверяем кеш
        cached = self.redis.get(f"user:{user_id}")
        if cached:
            return json.loads(cached)
        
        # 2. Ищем в основной БД
        user = self.db.query(User).get(user_id)
        
        # 3. Кешируем
        self.redis.setex(f"user:{user_id}", 3600, json.dumps(user))
        
        # 4. Логируем метрику
        self.metrics.write_points([{
            "measurement": "user_accessed",
            "fields": {"user_id": user_id}
        }])
        
        return user
    
    def search_users(self, query):
        # Используем Elasticsearch для полнотекстового поиска
        return self.es.search(index="users", body={
            "query": {"match": {"name": query}}
        })

Главное: выбирай инструмент под задачу, не наоборот. SQL не панацея, но и NoSQL не решает все проблемы.