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

Какие знаешь особенности реляционных баз данных?

2.0 Middle🔥 161 комментариев
#Базы данных (SQL)

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

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

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

Особенности реляционных баз данных

Реляционные базы данных (СУБД) — основной тип хранилищ данных в enterprise-приложениях. За 40+ лет они доказали эффективность, надёжность и универсальность. Вот ключевые особенности, которые я использую в разработке:

Структура данных

Таблицы и связи — главная идея реляционных БД. Данные организованы в таблицы (relations) с кортежами (rows) и атрибутами (columns). Каждая таблица имеет уникальный первичный ключ (Primary Key), который гарантирует уникальность записей.

# Пример SQLAlchemy модели
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True)
    email = Column(String(255), unique=True, nullable=False)
    name = Column(String(255))
    posts = relationship("Post", back_populates="author")

class Post(Base):
    __tablename__ = "posts"
    
    id = Column(Integer, primary_key=True)
    title = Column(String(500), nullable=False)
    user_id = Column(Integer, ForeignKey("users.id"))
    author = relationship("User", back_populates="posts")

Вторичные ключи (Foreign Keys) устанавливают связи между таблицами, обеспечивая ссылочную целостность.

ACID гарантии

Это основа надёжности реляционных БД:

  • Atomicity (Атомарность) — транзакция либо полностью завершится, либо откатится. Нет частичных изменений.
  • Consistency (Согласованность) — база переходит из одного консистентного состояния в другое. Все ограничения (constraints) соблюдаются.
  • Isolation (Изолированность) — конкурентные транзакции не влияют друг на друга. Есть уровни изоляции: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
  • Durability (Долговечность) — коммитнутые данные сохраняются даже при сбое системы.
# Пример ACID транзакции в Python
from sqlalchemy import create_engine
from sqlalchemy.orm import Session

engine = create_engine("postgresql://...")

with Session(engine) as session:
    try:
        user = User(email="test@example.com", name="Test User")
        session.add(user)
        session.flush()  # Проверяем constraints
        
        post = Post(title="Hello World", user_id=user.id)
        session.add(post)
        session.commit()  # Atomicity: всё или ничего
    except Exception as e:
        session.rollback()  # Откатываем при ошибке
        raise

Нормализация данных

Процесс организации данных для минимизации дублирования:

  • 1NF — атомарные значения, каждая колонка содержит одно значение.
  • 2NF — нет частичных зависимостей от составного ключа.
  • 3NF — нет транзитивных зависимостей, каждый неключевой атрибут зависит только от ключа.
  • BCNF — более строгая версия 3NF.

Нормализация снижает аномалии (insertion, deletion, update anomalies) и экономит место, но может требовать больше JOIN-ов.

SQL и запросы

Декларативный язык SQL позволяет просто описать, что нужно получить, а не как это получить. Оптимизатор базы сам выбирает лучший план выполнения.

# ORM vs Raw SQL
from sqlalchemy import text

# ORM — удобнее
users = session.query(User).filter(User.email.like("%@gmail.com")).all()

# Raw SQL — контроль
result = session.execute(
    text("SELECT * FROM users WHERE email LIKE :email"),
    {"email": "%@gmail.com"}
)
users = result.fetchall()

Индексы и производительность

Индексы ускоряют поиск данных, но замедляют INSERT/UPDATE. Создаю индексы на:

  • Primary Key (автоматический)
  • Foreign Key (для JOIN-ов)
  • Часто используемые фильтры (WHERE, ORDER BY)
class User(Base):
    __tablename__ = "users"
    
    id = Column(Integer, primary_key=True)
    email = Column(String(255), unique=True, index=True)  # Индекс для быстрого поиска
    created_at = Column(DateTime, index=True)  # Индекс для сортировки

Недостатки и когда они проявляются

  • Горизонтальное масштабирование — сложное шардирование.
  • Жесткая схема — миграции требуют downtime для больших таблиц.
  • Производительность при миллионах записей — требует оптимизации индексов и запросов.
  • Неподходит для неструктурированных данных — используй NoSQL для логов, JSON и т.п.

Практические рекомендации

  1. Используй транзакции для защиты от race conditions.
  2. Мониторь slow queries — EXPLAIN, EXPLAIN ANALYZE.
  3. Кэшируй часто запрашиваемые данные — Redis.
  4. Нормализуй, но не переусложняй — денормализуй при нужде для производительности.
  5. Регулярный backup — по расписанию, с проверкой восстановления.

В моих проектах я работаю с PostgreSQL, используя SQLAlchemy ORM и написание сложных запросов на чистом SQL для оптимизации.

Какие знаешь особенности реляционных баз данных? | PrepBro