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

Какие знаешь NoSQL (нереляционные) БД?

1.0 Junior🔥 131 комментариев
#Базы данных (NoSQL)#Soft Skills

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

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

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

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ДокументыВеб-приложенияСредняя
RedisKey-ValueКэш, сессии, очередиОчень высокая
PostgreSQL+JSONГибридОбщее назначениеВысокая
Neo4jГрафСоцсети, рекомендацииВысокая
ElasticsearchПоискПолнотекстовый поискВысокая
ClickHouseКолончатаяBig Data, аналитикаОчень высокая

Выбор NoSQL БД зависит от структуры данных и требований приложения. Часто используется несколько БД вместе (polyglot persistence).