Какие основные таблицы создаешь при проектировании БД?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные таблицы при проектировании БД для типичного веб-приложения
При проектировании реляционной базы данных для 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-запросы.