Какие знаешь NoSQL (нереляционные) БД?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
NoSQL (нереляционные) БД
NoSQL — широкая категория баз данных, которые отличаются от традиционных реляционных систем (PostgreSQL, MySQL). Они не используют таблицы и SQL, вместо этого предлагают гибкие структуры данных.
Основные категории
1. Document Stores (хранилища документов)
Хранят данные как JSON/BSON документы.
MongoDB — самая популярная
# Python пример с pymongo
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['shop']
collection = db['products']
# Вставка документа
product = {
'name': 'Ноутбук',
'price': 50000,
'specs': {
'cpu': 'Intel i7',
'ram': '16GB',
'storage': '512GB SSD'
},
'tags': ['electronics', 'computers']
}
collection.insert_one(product)
# Поиск
results = collection.find({'price': {'$gt': 30000}})
for doc in results:
print(doc['name'])
# Обновление
collection.update_one(
{'_id': product['_id']},
{'$set': {'price': 45000}}
)
Плюсы: гибкая структура, быстро разрабатывать Минусы: нет ACID по умолчанию, консистентность сложнее Когда использовать: приложения с вариативной структурой данных
CouchDB — другой популярный документ-store
- Встроенная HTTP API
- Master-to-master репликация
- MapReduce для запросов
2. Key-Value Stores (хранилища ключ-значение)
Ультра-быстрые хранилища данных в памяти.
Redis — лидер рынка
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# Простой ключ-значение
r.set('user:1:name', 'Alice')
name = r.get('user:1:name') # b'Alice'
# Структуры данных
r.lpush('queue:jobs', 'job1', 'job2', 'job3')
job = r.lpop('queue:jobs') # b'job1'
# Хеш (вложенный объект)
r.hset('user:1', mapping={
'name': 'Alice',
'email': 'alice@example.com',
'age': 30
})
user = r.hgetall('user:1')
# {b'name': b'Alice', b'email': b'alice@example.com', b'age': b'30'}
# Set (уникальные значения)
r.sadd('tags:popular', 'python', 'javascript', 'golang')
all_tags = r.smembers('tags:popular')
# Sorted Set (сортированные по score)
r.zadd('leaderboard', {'alice': 100, 'bob': 85, 'charlie': 90})
top3 = r.zrange('leaderboard', 0, 2, withscores=True)
# [(b'bob', 85.0), (b'charlie', 90.0), (b'alice', 100.0)]
# TTL (время жизни)
r.setex('session:123', 3600, 'session_data') # 1 час
Плюсы: очень быстро (~1 млн операций/сек), простой API Минусы: все в памяти (нужна RAM для всех данных), нет типизации Когда использовать: кэширование, сессии, очереди, реал-тайм данные
Memcached — аналог Redis, но проще
- Только key-value
- Нет структур данных
- LRU эвикция (удаление старых данных)
3. Column-Family Stores (колончатые БД)
Хранят данные по столбцам вместо строк, оптимально для аналитики.
HBase (на базе Hadoop)
# Концепт (не приводу реальный код, сложен)
# Таблица хранится как:
# row_key | column_family:column_name | value
# user:1 | profile:name | Alice
# user:1 | profile:email | alice@ex.com
# user:1 | stats:posts | 42
# user:2 | profile:name | Bob
# user:2 | stats:followers | 1000
Плюсы: оптимально для big data, сжатие, масштабируемость Минусы: сложно настраивать, нужен Hadoop/Spark кластер Когда использовать: big data, аналитика, временные ряды
ClickHouse — быстрая колончатая БД от Яндекса
# Python пример с clickhouse-driver
from clickhouse_driver import Client
client = Client('localhost')
# Вставка
data = [
('Alice', 'alice@example.com', 100),
('Bob', 'bob@example.com', 85),
]
client.execute(
'INSERT INTO users (name, email, score) VALUES',
data
)
# Запрос
result = client.execute('SELECT name, score FROM users WHERE score > 90')
print(result) # [('Alice', 100)]
4. Graph Databases (графовые БД)
Хранят данные как граф (узлы и рёбра).
Neo4j — самая популярная
from neo4j import GraphDatabase
driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', 'password'))
with driver.session() as session:
# Создание узлов и отношений
session.run(
'CREATE (a:Person {name: $name}) RETURN a',
name='Alice'
)
session.run(
'CREATE (p1:Person {name: "Alice"})-[:KNOWS]->(p2:Person {name: "Bob"})',
)
# Поиск друзей друзей
result = session.run(
'MATCH (a:Person)-[:KNOWS]->(b:Person)-[:KNOWS]->(c:Person) '
'WHERE a.name = $name RETURN c.name',
name='Alice'
)
for record in result:
print(record[0])
Плюсы: оптимально для отношений (соцсети, рекомендации), быстрые траверсалы Минусы: не для всех задач нужен граф Когда использовать: соцсети, системы рекомендаций, knowledge graphs
5. Search Engines (поисковые движки)
Оптимизированы для полнотекстового поиска.
Elasticsearch
from elasticsearch import Elasticsearch
es = Elasticsearch(['localhost:9200'])
# Индексирование документов
es.index(index='articles', doc_type='_doc', id=1, body={
'title': 'Python Best Practices',
'body': 'In this article we discuss...',
'author': 'Alice'
})
# Поиск
result = es.search(index='articles', body={
'query': {
'multi_match': {
'query': 'Python best practices',
'fields': ['title^2', 'body']
}
}
})
for hit in result['hits']['hits']:
print(hit['_source']['title'])
Плюсы: мощный полнотекстовый поиск, фильтрация, агрегация Минусы: требует отдельного сервиса, сложный setup Когда использовать: поиск по контенту, логирование (ELK stack)
6. Time-Series Databases (БД временных рядов)
InfluxDB, Prometheus — для метрик и временных рядов
# InfluxDB
from influxdb import InfluxDBClient
client = InfluxDBClient(host='localhost', port=8086)
# Запись метрики
json_body = [
{
'measurement': 'cpu_load',
'tags': {'host': 'server-01'},
'time': '2024-01-01T00:00:00Z',
'fields': {'value': 0.64}
}
]
client.write_points(json_body)
# Запрос
result = client.query('SELECT value FROM cpu_load WHERE host=\'server-01\'')
for point in result.get_points():
print(point)
Сравнение
| БД | Тип | Использование | Скорость |
|---|---|---|---|
| MongoDB | Документы | Веб-приложения | Средняя |
| Redis | Key-Value | Кэш, сессии, очереди | Очень высокая |
| PostgreSQL+JSON | Гибрид | Общее назначение | Высокая |
| Neo4j | Граф | Соцсети, рекомендации | Высокая |
| Elasticsearch | Поиск | Полнотекстовый поиск | Высокая |
| ClickHouse | Колончатая | Big Data, аналитика | Очень высокая |
Выбор NoSQL БД зависит от структуры данных и требований приложения. Часто используется несколько БД вместе (polyglot persistence).