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

Какие основные таблицы создаешь при проектировании БД?

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

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Основные таблицы при проектировании БД для типичного веб-приложения

При проектировании реляционной базы данных для PHP Backend приложения я начинаю с выделения сущностей, которые будут ядром системы. Ниже — ключевые таблицы, которые я создаю практически в любом проекте, с пояснениями и примерами на SQL.

1. Таблицы для аутентификации и авторизации (users, roles, permissions)

Эти таблицы отвечают за управление пользователями и их правами.

Таблица users — хранит основную информацию о пользователях:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    username VARCHAR(100) UNIQUE,
    is_active BOOLEAN DEFAULT TRUE,
    email_verified_at TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Таблицы roles и permissions для реализации RBAC (Role-Based Access Control):

CREATE TABLE roles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) UNIQUE NOT NULL,
    description TEXT
);

CREATE TABLE permissions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) UNIQUE NOT NULL,
    description TEXT
);

-- Связующая таблика для many-to-many связи пользователей и ролей
CREATE TABLE user_roles (
    user_id INT,
    role_id INT,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);

2. Таблицы для контента и бизнес-логики

В зависимости от предметной области, но почти всегда присутствуют:

Таблица posts или articles (для блога, новостного сайта):

CREATE TABLE posts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    title VARCHAR(255) NOT NULL,
    slug VARCHAR(255) UNIQUE NOT NULL,
    content TEXT,
    status ENUM('draft', 'published', 'archived') DEFAULT 'draft',
    published_at TIMESTAMP NULL,
    views_count INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Таблица categories для организации контента:

CREATE TABLE categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    slug VARCHAR(100) UNIQUE NOT NULL,
    parent_id INT NULL,
    FOREIGN KEY (parent_id) REFERENCES categories(id) ON DELETE SET NULL
);

3. Таблицы для связей и взаимодействий

Таблица comments для пользовательских комментариев:

CREATE TABLE comments (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    post_id INT NOT NULL,
    content TEXT NOT NULL,
    parent_id INT NULL, -- для вложенных комментариев
    is_approved BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE
);

Таблица tags и связующая таблица post_tags (many-to-many):

CREATE TABLE tags (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) UNIQUE NOT NULL,
    slug VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE post_tags (
    post_id INT,
    tag_id INT,
    PRIMARY KEY (post_id, tag_id),
    FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);

4. Вспомогательные и системные таблицы

Таблица media или uploads для управления файлами:

CREATE TABLE media (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    original_name VARCHAR(255),
    storage_path VARCHAR(500) NOT NULL,
    mime_type VARCHAR(100),
    size INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Таблица settings для хранения настроек приложения:

CREATE TABLE settings (
    id INT PRIMARY KEY AUTO_INCREMENT,
    `key` VARCHAR(100) UNIQUE NOT NULL,
    value TEXT,
    description TEXT
);

5. Таблицы для электронной коммерции (если применимо)

Для интернет-магазина обязательно добавляю:

  • products (товары)
  • orders (заказы)
  • order_items (позиции в заказе)
  • payments (платежи)

Пример таблицы orders:

CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    status ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    payment_method VARCHAR(50),
    shipping_address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

Ключевые принципы, которых я придерживаюсь:

  • Нормализация данных до 3NF для избежания аномалий
  • Использование внешних ключей (foreign keys) для поддержания целостности
  • Индексация часто запрашиваемых полей (email, slug, статусы)
  • Мягкое удаление (soft delete) через флаг is_deleted или deleted_at вместо физического удаления
  • Аудитрильные поля (created_at, updated_at, deleted_at) во всех значимых таблицах
  • Использование ENUM или отдельной таблицы справочников для полей с ограниченным набором значений

Такой подход обеспечивает масштабируемость, легкость поддержки и гибкость при развитии приложения. Каждая таблица имеет четкую ответственность, а связи между ними позволяют эффективно извлекать связанные данные через JOIN-запросы.