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

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

2.0 Middle🔥 111 комментариев
#Python Core

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

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

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

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

Реляционные БД организуют данные в структурированном виде с использованием таблиц, строк и столбцов. Это один из самых популярных подходов к хранению данных.

Основная структура

Database
  └── Schema (схема, нарпример public)
       └── Table 1
            ├── Column (id, name, email)
            ├── Row (запись)
            └── Index (для быстрого поиска)
       └── Table 2
            └── ...

Таблица и её компоненты

Таблица — это двумерная структура данных:

┌────┬───────────┬─────────────────────┐
│ id │   name    │      email          │
├────┼───────────┼─────────────────────┤
│  1 │ John Doe  │ john@example.com    │
│  2 │ Jane Smith│ jane@example.com    │
│  3 │ Bob Jones │ bob@example.com     │
└────┴───────────┴─────────────────────┘
  • Столбец (Column) — атрибут (name, email)
  • Строка (Row) — запись о конкретной сущности
  • Ячейка — пересечение строки и столбца

Типы данных и хранение

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT,
    balance DECIMAL(10, 2),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    is_active BOOLEAN DEFAULT true
);

Физическое хранилище:

  • Данные хранятся в блокахпамяти (обычно 4-8 KB)
  • Каждая таблица — это файлы на диске
  • Строки распределены по блокам последовательно или согласно индексам

Индексы

Ускоряют поиск и сортировку:

# Primary Key Index (B-Tree)
CREATE TABLE users (
    id INT PRIMARY KEY,  -- автоматически индексируется
    ...
);

# Обычный индекс
CREATE INDEX idx_email ON users(email);

# Составной индекс
CREATE INDEX idx_name_email ON users(name, email);

# Уникальный индекс
CREATE UNIQUE INDEX idx_username ON users(username);

B-Tree индекс (наиболее частый):

            [50]
          /      \\
       [20]        [80]
      /   \\      /   \\
    [10] [35]  [60] [95]

Бинарное дерево для быстрого поиска за O(log n).

Отношения между таблицами

# Таблица пользователей
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

# Таблица заказов
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT NOT NULL,
    amount DECIMAL(10, 2),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Один-ко-многим (1:N):

User 1 ----< Orders (1:N)
  id           user_id
  1      ┌─────────────┐
         │  order 1    │
         │  order 2    │
         │  order 3    │
         └─────────────┘

Многие-ко-многим (N:M):

# Таблица студентов
CREATE TABLE students (id INT PRIMARY KEY, name VARCHAR(255));

# Таблица курсов
CREATE TABLE courses (id INT PRIMARY KEY, name VARCHAR(255));

# Промежуточная таблица (junction table)
CREATE TABLE student_courses (
    student_id INT,
    course_id INT,
    grade VARCHAR(2),
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

Нормализация (Normalization)

Уменьшает дублирование данных:

# ❌ Ненормализованно (дублирование)
CREATE TABLE orders (
    id INT,
    customer_name VARCHAR(255),
    customer_email VARCHAR(255),
    customer_phone VARCHAR(20),
    product_name VARCHAR(255),
    product_price DECIMAL(10, 2)
);

# ✅ Нормализовано (1NF, 2NF, 3NF)
CREATE TABLE customers (id INT PRIMARY KEY, name, email, phone);
CREATE TABLE products (id INT PRIMARY KEY, name, price);
CREATE TABLE orders (id INT, customer_id INT, product_id INT, ...);

ACID свойства

Реляционные БД гарантируют:

# Atomicity — всё или ничего
BEGIN TRANSACTION
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;  # Обе операции или ни одна

# Consistency — логическая целостность
# FOREIGN KEY обеспечивает ссылочную целостность

# Isolation — независимость транзакций
# Одна транзакция не видит незавершённые изменения другой

# Durability — стойкость данных
# Закоммиченные данные сохраняются даже при сбое

Физическое хранилище на диске

Database Files
  ├── users.dat       (данные таблицы users)
  ├── users.idx       (индексы для users)
  ├── orders.dat      (данные таблицы orders)
  ├── orders.idx      (индексы для orders)
  └── log file        (журнал транзакций для восстановления)

Примеры использования

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker

engine = create_engine("postgresql://user:password@localhost/mydb")
Session = sessionmaker(bind=engine)
session = Session()

# Запись данных
user = User(name="John", email="john@example.com")
session.add(user)
session.commit()

# Чтение данных
users = session.query(User).filter(User.age > 25).all()

Преимущества реляционных БД

  • Структурированность — чёткая схема
  • ACID — надёжность транзакций
  • Query Language — мощный SQL
  • Нормализация — минимум дублирования
  • Масштабируемость — мощные инструменты оптимизации

Реляционные БД подходят для большинства бизнес-приложений с хорошо определённой структурой данных.