Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Базы данных кроме 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 не решает все проблемы.