Что такое система управления базами данных?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Система управления базами данных (СУБД)
СУБД (Database Management System, DBMS) — это программное обеспечение, которое позволяет создавать, хранить, структурировать, изменять и извлекать данные из баз данных. СУБД управляет доступом к данным, обеспечивает безопасность, целостность и производительность.
Основные функции СУБД
- Хранение данных — организация и сохранение данных на диске
- Извлечение данных — быстрый поиск и получение нужной информации
- Обновление и удаление — изменение и удаление записей
- Безопасность — контроль доступа, аутентификация, шифрование
- Целостность данных — обеспечение консистентности (ACID)
- Оптимизация производительности — индексы, кеширование
- Резервное копирование и восстановление — защита от потери данных
Архитектура СУБД
ПРИЛОЖЕНИЕ
↓
[Query Language Interface] (SQL, NoSQL API)
↓
[Query Optimizer] (выбор оптимального пути)
↓
[Query Executor] (выполнение запроса)
↓
[Storage Engine] (чтение/запись на диск)
↓
ДИСК (файловая система)
Типы СУБД
1. Реляционные СУБД (RDBMS)
Данные организованы в таблицы с строками и столбцами:
# Примеры: PostgreSQL, MySQL, Oracle, MS SQL Server
# Работа через SQL
import psycopg2
conn = psycopg2.connect("dbname=myapp user=postgres")
cur = conn.cursor()
# Создание таблицы
cur.execute("""
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE,
name VARCHAR(100)
)
""")
# Вставка данных
cur.execute(
"INSERT INTO users (email, name) VALUES (%s, %s)",
("john@example.com", "John")
)
# Запрос данных
cur.execute("SELECT * FROM users WHERE email = %s", ("john@example.com",))
user = cur.fetchone()
print(user) # (1, john@example.com, John)
conn.commit()
conn.close()
2. NoSQL СУБД
Данные не обязательно организованы в таблицы (документы, графы, ключ-значение):
Document-oriented (MongoDB):
from pymongo import MongoClient
client = MongoClient("mongodb://localhost:27017")
db = client["myapp"]
users = db["users"]
# Вставка документа
user = {"email": "john@example.com", "name": "John", "age": 30}
result = users.insert_one(user)
print(result.inserted_id)
# Поиск
found = users.find_one({"email": "john@example.com"})
print(found) # {_id: ..., email: john@example.com, name: John, age: 30}
# Обновление
users.update_one({"email": "john@example.com"}, {"$set": {"age": 31}})
Key-Value (Redis):
import redis
r = redis.Redis(host="localhost", port=6379)
# Хранение данных
r.set("user:1:name", "John")
r.set("user:1:email", "john@example.com")
# Получение данных
name = r.get("user:1:name") # bJohn
email = r.get("user:1:email") # bjohn@example.com
# Очереди
r.lpush("tasks", "task1", "task2")
task = r.rpop("tasks") # Получить из очереди
Graph (Neo4j):
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687")
def create_relationship(tx):
tx.run(
"CREATE (a:Person {name: $name}) RETURN a",
name="Alice"
)
tx.run(
"MATCH (a:Person {name: Alice}), (b:Person {name: Bob}) "
"CREATE (a)-[:KNOWS]->(b)"
)
with driver.session() as session:
session.execute_write(create_relationship)
Транзакции (ACID)
Транзакция — это набор операций, которые либо все выполняются, либо все отменяются:
import psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE
conn = psycopg2.connect("dbname=bank user=postgres")
conn.set_isolation_level(ISOLATION_LEVEL_SERIALIZABLE)
cur = conn.cursor()
try:
# Начало транзакции
cur.execute("BEGIN")
# Список со счёта A
cur.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
# Если ошибка - откатывается
if some_error:
raise Exception("Ошибка!")
# Пополнение счёта B
cur.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
# Коммит (сохранение)
conn.commit()
print("Транзакция успешна")
except Exception as e:
conn.rollback() # Откат
print(f"Транзакция отменена: {e}")
finally:
cur.close()
conn.close()
Индексы для оптимизации
Индексы ускоряют поиск данных:
# Создание индекса
cur.execute("CREATE INDEX idx_email ON users(email)")
# Теперь поиск по email будет быстрым
cur.execute("SELECT * FROM users WHERE email = %s", ("john@example.com",))
ORM (Object-Relational Mapping)
Библиотеки для работы с БД через Python объекты:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
email = Column(String(100), unique=True)
name = Column(String(100))
engine = create_engine("postgresql://user:password@localhost/myapp")
Base.metadata.create_all(engine)
# Вставка
with Session(engine) as session:
user = User(email="john@example.com", name="John")
session.add(user)
session.commit()
# Запрос
with Session(engine) as session:
user = session.query(User).filter_by(email="john@example.com").first()
print(user.name) # John
Выбор СУБД
| СУБД | Когда использовать |
|---|---|
| PostgreSQL | Структурированные данные, сложные запросы |
| MySQL | Web приложения, простые проекты |
| MongoDB | Документы, быстрое прототипирование |
| Redis | Кеш, очереди, сессии |
| Neo4j | Графики, соцсети, рекомендации |
СУБД — это сердце любого приложения, работающего с данными. Выбор правильной СУБД критичен для производительности и надёжности системы.