На что подразделяются нереляционные БД?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# На что подразделяются нереляционные БД?
Нереляционные (NoSQL) базы данных подразделяются на несколько основных категорий в зависимости от способа хранения и организации данных.
1. Документные БД (Document Stores)
Хранят данные в виде полуструктурированных документов (обычно JSON или BSON). Каждый документ может иметь разную структуру.
Примеры: MongoDB, CouchDB, Firebase
import pymongo
client = pymongo.MongoClient()
db = client["shop"]
users = db["users"]
user = {
"name": "Alice",
"email": "alice@example.com",
"orders": [
{"id": 1, "product": "Laptop"},
{"id": 2, "product": "Mouse"}
]
}
result = users.insert_one(user)
user = users.find_one({"email": "alice@example.com"})
Преимущества: гибкая схема, близость к объектам, вложенные данные без JOIN'ов.
2. Хранилища ключ-значение (Key-Value Stores)
Самая простая модель: каждому ключу соответствует значение. Работают в памяти.
Примеры: Redis, Memcached, DynamoDB
import redis
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
r.set("user:1:name", "Bob")
name = r.get("user:1:name")
r.setex("session:abc", 3600, '{"user_id": 1}')
r.incr("page_views")
r.rpush("queue:tasks", "task1", "task2")
task = r.lpop("queue:tasks")
Преимущества: экстремальная скорость, простота, встроенные структуры данных (list, set, hash).
3. Поисковые системы (Search Engines)
Оптимизированы для полнотекстового поиска. Инвертированный индекс позволяет быстро искать по содержимому.
Примеры: Elasticsearch, Solr, Meilisearch
from elasticsearch import Elasticsearch
es = Elasticsearch(["http://localhost:9200"])
doc = {
"title": "Python для начинающих",
"content": "Подробное руководство",
"author": "John Doe"
}
es.index(index="articles", id=1, document=doc)
results = es.search(index="articles", query={
"multi_match": {
"query": "Python руководство",
"fields": ["title^2", "content"]
}
})
for hit in results["hits"]["hits"]:
print(f"{hit['_source']['title']}")
Преимущества: полнотекстовый поиск, фасетная навигация, ранжирование по релевантности.
4. Граф-ориентированные БД (Graph Databases)
Хранят данные в виде узлов и рёбер. Оптимальны для данных с множественными связями.
Примеры: Neo4j, Amazon Neptune
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
def create_relationships(session):
session.run("""
CREATE (alice:Person {name: "Alice", age: 30})
CREATE (bob:Person {name: "Bob", age: 28})
CREATE (alice)-[:KNOWS]->(bob)
""")
def find_friends(session, person_name):
result = session.run("""
MATCH (p:Person {name: $name})-[:KNOWS]->()-[:KNOWS]->(fof:Person)
RETURN DISTINCT fof.name as friend
""", name=person_name)
return [record["friend"] for record in result]
with driver.session() as session:
create_relationships(session)
friends = find_friends(session, "Alice")
Преимущества: быстрые запросы по связям, рекомендации, анализ социальных сетей.
5. Колонные хранилища (Column-Family Stores)
Данные хранятся по столбцам, оптимизированы для аналитики больших наборов данных.
Примеры: HBase, Cassandra, ClickHouse
from cassandra.cluster import Cluster
cluster = Cluster(["127.0.0.1"])
session = cluster.connect()
session.execute("""
CREATE TABLE IF NOT EXISTS metrics.server_metrics (
server_id TEXT,
timestamp BIGINT,
cpu_usage FLOAT,
PRIMARY KEY (server_id, timestamp)
)
""")
session.execute("""
INSERT INTO metrics.server_metrics (server_id, timestamp, cpu_usage)
VALUES (%s, %s, %s)
""", ("server-1", 1699564800, 45.2))
Преимущества: отличная сжимаемость, быстрые аналитические запросы, временные ряды.
Сравнение
| Тип | Использование | Примеры |
|---|---|---|
| Документные | Веб-приложения | MongoDB, CouchDB |
| Ключ-значение | Кэширование, сессии | Redis, Memcached |
| Поисковые | Полнотекстовый поиск | Elasticsearch |
| Граф | Социальные сети | Neo4j |
| Колонные | Аналитика, временные ряды | Cassandra |
Выбор NoSQL БД зависит от структуры данных и типа запросов.