758 lines
32 KiB
Markdown
758 lines
32 KiB
Markdown
# Документация базы данных интернет-магазина
|
||
|
||
## Описание проекта
|
||
|
||
База данных для интернет-магазина на PostgreSQL, включающая систему управления пользователями с ролями и правами доступа, каталог товаров, систему заказов, корзину покупок, отзывы и платежи.
|
||
|
||
## Структура файлов
|
||
|
||
Проект состоит из четырех SQL-файлов, которые должны выполняться в следующем порядке:
|
||
|
||
1. **schema.sql** - Создание структуры базы данных (таблицы, функции)
|
||
2. **indexes.sql** - Создание индексов для оптимизации запросов
|
||
3. **triggers.sql** - Создание триггеров для автоматизации процессов
|
||
4. **seed_data.sql** - Заполнение начальными данными
|
||
|
||
## Порядок установки
|
||
|
||
```sql
|
||
-- 1. Создание структуры
|
||
\i schema.sql
|
||
|
||
-- 2. Создание индексов
|
||
\i indexes.sql
|
||
|
||
-- 3. Создание триггеров
|
||
\i triggers.sql
|
||
|
||
-- 4. Заполнение данными
|
||
\i seed_data.sql
|
||
```
|
||
|
||
## Архитектура базы данных
|
||
|
||
### Система авторизации и прав доступа
|
||
|
||
База данных использует гибкую систему ролей и прав доступа (RBAC - Role-Based Access Control):
|
||
|
||
- **Ресурсы (resources)** - объекты системы (товары, заказы, категории и т.д.)
|
||
- **Действия (actions)** - операции над ресурсами (просмотр, создание, редактирование, удаление)
|
||
- **Права доступа (permissions)** - комбинация ресурса и действия
|
||
- **Роли (roles)** - наборы прав доступа
|
||
- **Пользователи (users)** - привязаны к ролям
|
||
|
||
### Основные модули
|
||
|
||
1. **Управление товарами** - категории, товары, изображения
|
||
2. **Управление заказами** - заказы, элементы заказов, статусы
|
||
3. **Корзина покупок** - временное хранение товаров перед оформлением заказа
|
||
4. **Отзывы и рейтинги** - система отзывов с автоматическим расчетом рейтинга
|
||
5. **Платежи** - управление платежами по заказам
|
||
6. **Адреса доставки** - адреса пользователей
|
||
|
||
---
|
||
|
||
## Описание таблиц
|
||
|
||
### 1. Система авторизации
|
||
|
||
#### `resources` - Ресурсы системы
|
||
Хранит список ресурсов (объектов), к которым можно предоставить доступ.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название ресурса |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор (URL-friendly) |
|
||
| description | TEXT | Описание ресурса |
|
||
| is_active | BOOLEAN | Активен ли ресурс |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Примеры ресурсов:** products, orders, categories, reviews, cart, users
|
||
|
||
#### `actions` - Действия над ресурсами
|
||
Хранит список действий, которые можно выполнять над ресурсами.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название действия |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор |
|
||
| description | TEXT | Описание действия |
|
||
| is_active | BOOLEAN | Активно ли действие |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Примеры действий:** view, create, edit, delete, moderate, manage
|
||
|
||
#### `permissions` - Права доступа
|
||
Комбинация ресурса и действия. Определяет конкретное право доступа.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название права |
|
||
| slug | VARCHAR(100) | Уникальный идентификатор (формат: resource.action) |
|
||
| resource_id | INTEGER | Ссылка на ресурс |
|
||
| action_id | INTEGER | Ссылка на действие |
|
||
| description | TEXT | Описание права |
|
||
| is_active | BOOLEAN | Активно ли право |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:** UNIQUE(resource_id, action_id) - одна комбинация ресурса и действия
|
||
|
||
#### `roles` - Роли пользователей
|
||
Роли, которые могут быть назначены пользователям.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название роли |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор |
|
||
| description | TEXT | Описание роли |
|
||
| is_active | BOOLEAN | Активна ли роль |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Предустановленные роли:**
|
||
- `admin` - Администратор (полные права)
|
||
- `owner` - Владелец магазина
|
||
- `employee` - Сотрудник
|
||
- `manager` - Менеджер
|
||
- `customer` - Клиент (покупатель)
|
||
|
||
#### `role_permissions` - Связь ролей и прав
|
||
Связывает роли с правами доступа (многие-ко-многим).
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| role_id | INTEGER | Ссылка на роль |
|
||
| permission_id | INTEGER | Ссылка на право доступа |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
|
||
**Ограничения:** UNIQUE(role_id, permission_id)
|
||
|
||
#### `users` - Пользователи системы
|
||
Пользователи системы (покупатели и администраторы).
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| email | VARCHAR(255) | Email (уникальный) |
|
||
| password_hash | VARCHAR(255) | Хеш пароля |
|
||
| first_name | VARCHAR(100) | Имя |
|
||
| last_name | VARCHAR(100) | Фамилия |
|
||
| phone | VARCHAR(20) | Телефон |
|
||
| telegram_id | BIGINT | ID в Telegram (уникальный) |
|
||
| role_id | INTEGER | Ссылка на роль |
|
||
| is_active | BOOLEAN | Активен ли пользователь |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Особенности:**
|
||
- Поддержка авторизации через email или Telegram
|
||
- Связь с ролью через `role_id`
|
||
|
||
---
|
||
|
||
### 2. Каталог товаров
|
||
|
||
#### `categories` - Категории товаров
|
||
Иерархическая структура категорий товаров.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(255) | Название категории |
|
||
| slug | VARCHAR(255) | Уникальный идентификатор (URL-friendly) |
|
||
| description | TEXT | Описание категории |
|
||
| parent_id | INTEGER | Ссылка на родительскую категорию (для иерархии) |
|
||
| image_url | VARCHAR(500) | URL изображения категории |
|
||
| is_active | BOOLEAN | Активна ли категория |
|
||
| sort_order | INTEGER | Порядок сортировки |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Особенности:**
|
||
- Поддержка вложенных категорий через `parent_id`
|
||
- Возможность сортировки через `sort_order`
|
||
|
||
#### `products` - Товары
|
||
Основная информация о товарах магазина.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(255) | Название товара |
|
||
| slug | VARCHAR(255) | Уникальный идентификатор (URL-friendly) |
|
||
| description | TEXT | Полное описание |
|
||
| short_description | TEXT | Краткое описание |
|
||
| sku | VARCHAR(100) | Артикул товара (уникальный) |
|
||
| price | DECIMAL(10, 2) | Цена продажи |
|
||
| compare_at_price | DECIMAL(10, 2) | Старая цена (для отображения скидки) |
|
||
| cost_price | DECIMAL(10, 2) | Себестоимость |
|
||
| category_id | INTEGER | Ссылка на категорию |
|
||
| stock_quantity | INTEGER | Количество на складе |
|
||
| weight | DECIMAL(8, 2) | Вес товара |
|
||
| dimensions | VARCHAR(100) | Размеры товара |
|
||
| is_active | BOOLEAN | Активен ли товар |
|
||
| is_featured | BOOLEAN | Рекомендуемый товар |
|
||
| rating | DECIMAL(3, 2) | Средний рейтинг (0-5) |
|
||
| review_count | INTEGER | Количество одобренных отзывов |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:**
|
||
- `price >= 0`
|
||
- `compare_at_price >= 0`
|
||
- `cost_price >= 0`
|
||
- `stock_quantity >= 0`
|
||
- `rating >= 0 AND rating <= 5`
|
||
|
||
**Особенности:**
|
||
- Рейтинг и количество отзывов обновляются автоматически через триггеры
|
||
|
||
#### `product_images` - Изображения товаров
|
||
Изображения товаров с поддержкой множественных изображений.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| product_id | INTEGER | Ссылка на товар |
|
||
| image_url | VARCHAR(500) | URL изображения |
|
||
| alt_text | VARCHAR(255) | Альтернативный текст для изображения |
|
||
| is_primary | BOOLEAN | Основное изображение |
|
||
| sort_order | INTEGER | Порядок сортировки |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
|
||
**Особенности:**
|
||
- Поддержка нескольких изображений на товар
|
||
- Одно изображение может быть помечено как основное (`is_primary = TRUE`)
|
||
|
||
---
|
||
|
||
### 3. Система заказов
|
||
|
||
#### `order_statuses` - Статусы заказов
|
||
Предустановленные статусы заказов.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название статуса |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор |
|
||
| description | TEXT | Описание статуса |
|
||
| color | VARCHAR(20) | Цвет для отображения в интерфейсе |
|
||
| sort_order | INTEGER | Порядок сортировки |
|
||
| is_active | BOOLEAN | Активен ли статус |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Предустановленные статусы:**
|
||
- `pending` - Ожидает обработки
|
||
- `processing` - В обработке
|
||
- `shipped` - Отправлен
|
||
- `delivered` - Доставлен
|
||
- `cancelled` - Отменен
|
||
- `refunded` - Возвращен
|
||
|
||
#### `payment_methods` - Способы оплаты
|
||
Справочник способов оплаты.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название способа оплаты |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор |
|
||
| description | TEXT | Описание способа оплаты |
|
||
| is_active | BOOLEAN | Активен ли способ оплаты |
|
||
| sort_order | INTEGER | Порядок сортировки |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Предустановленные способы оплаты:**
|
||
- `card` - Банковская карта
|
||
- `e-wallet` - Электронный кошелек
|
||
- `cash_on_delivery` - Наличные при получении
|
||
- `bank_transfer` - Банковский перевод
|
||
- `crypto` - Криптовалюта
|
||
|
||
#### `payment_statuses` - Статусы платежей
|
||
Справочник статусов платежей.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| name | VARCHAR(100) | Название статуса |
|
||
| slug | VARCHAR(50) | Уникальный идентификатор |
|
||
| description | TEXT | Описание статуса |
|
||
| color | VARCHAR(20) | Цвет для отображения в интерфейсе |
|
||
| sort_order | INTEGER | Порядок сортировки |
|
||
| is_active | BOOLEAN | Активен ли статус |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Предустановленные статусы:**
|
||
- `pending` - Ожидает оплаты
|
||
- `paid` - Оплачен
|
||
- `completed` - Завершен
|
||
- `failed` - Ошибка оплаты
|
||
- `refunded` - Возвращен
|
||
|
||
#### `orders` - Заказы
|
||
Основная информация о заказах покупателей.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| user_id | INTEGER | Ссылка на пользователя |
|
||
| order_number | VARCHAR(50) | Уникальный номер заказа |
|
||
| status_id | INTEGER | Ссылка на статус заказа |
|
||
| subtotal | DECIMAL(10, 2) | Сумма товаров |
|
||
| tax_amount | DECIMAL(10, 2) | Сумма налогов |
|
||
| shipping_cost | DECIMAL(10, 2) | Стоимость доставки |
|
||
| discount_amount | DECIMAL(10, 2) | Сумма скидки |
|
||
| total_amount | DECIMAL(10, 2) | Итоговая сумма |
|
||
| shipping_address_id | INTEGER | Ссылка на адрес доставки |
|
||
| billing_address_id | INTEGER | Ссылка на адрес для выставления счета |
|
||
| payment_method_id | INTEGER | Ссылка на способ оплаты |
|
||
| payment_status_id | INTEGER | Ссылка на статус платежа |
|
||
| notes | TEXT | Примечания к заказу |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:**
|
||
- `subtotal >= 0`
|
||
- `tax_amount >= 0`
|
||
- `shipping_cost >= 0`
|
||
- `discount_amount >= 0`
|
||
- `total_amount >= 0`
|
||
|
||
**Особенности:**
|
||
- Номер заказа генерируется автоматически через триггер в формате: `ORD-YYYYMMDD-XXXXXX`
|
||
|
||
#### `order_items` - Элементы заказа
|
||
Товары, входящие в заказ.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| order_id | INTEGER | Ссылка на заказ |
|
||
| product_id | INTEGER | Ссылка на товар |
|
||
| product_name | VARCHAR(255) | Название товара на момент заказа |
|
||
| product_sku | VARCHAR(100) | Артикул товара на момент заказа |
|
||
| quantity | INTEGER | Количество |
|
||
| price | DECIMAL(10, 2) | Цена за единицу на момент заказа |
|
||
| subtotal | DECIMAL(10, 2) | Сумма по позиции |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
|
||
**Ограничения:**
|
||
- `quantity > 0`
|
||
- `price >= 0`
|
||
- `subtotal >= 0`
|
||
|
||
**Особенности:**
|
||
- Сохраняет название, артикул и цену товара на момент заказа (на случай изменения товара в будущем)
|
||
|
||
---
|
||
|
||
### 4. Корзина покупок
|
||
|
||
#### `cart_items` - Корзина покупок
|
||
Временное хранение товаров перед оформлением заказа.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| user_id | INTEGER | Ссылка на пользователя |
|
||
| product_id | INTEGER | Ссылка на товар |
|
||
| quantity | INTEGER | Количество |
|
||
| created_at | TIMESTAMP | Дата добавления |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:**
|
||
- `quantity > 0`
|
||
- UNIQUE(user_id, product_id) - один товар может быть в корзине только один раз
|
||
|
||
---
|
||
|
||
### 5. Отзывы и рейтинги
|
||
|
||
#### `reviews` - Отзывы на товары
|
||
Отзывы покупателей на товары.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| product_id | INTEGER | Ссылка на товар |
|
||
| user_id | INTEGER | Ссылка на пользователя |
|
||
| rating | INTEGER | Оценка (1-5) |
|
||
| title | VARCHAR(255) | Заголовок отзыва |
|
||
| comment | TEXT | Текст отзыва |
|
||
| is_approved | BOOLEAN | Одобрен ли отзыв модератором |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:**
|
||
- `rating >= 1 AND rating <= 5`
|
||
- UNIQUE(product_id, user_id) - один пользователь может оставить только один отзыв на товар
|
||
|
||
**Особенности:**
|
||
- Отзывы требуют модерации (`is_approved = FALSE` по умолчанию)
|
||
- Рейтинг товара обновляется автоматически при одобрении/изменении отзывов
|
||
|
||
---
|
||
|
||
### 6. Платежи
|
||
|
||
#### `payments` - Платежи по заказам
|
||
Информация о платежах по заказам.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| order_id | INTEGER | Ссылка на заказ |
|
||
| payment_method_id | INTEGER | Ссылка на способ оплаты |
|
||
| transaction_id | VARCHAR(255) | ID транзакции в платежной системе (уникальный) |
|
||
| amount | DECIMAL(10, 2) | Сумма платежа |
|
||
| status_id | INTEGER | Ссылка на статус платежа |
|
||
| payment_date | TIMESTAMP | Дата платежа |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
**Ограничения:**
|
||
- `amount >= 0`
|
||
|
||
---
|
||
|
||
### 7. Адреса доставки
|
||
|
||
#### `addresses` - Адреса пользователей
|
||
Адреса доставки пользователей.
|
||
|
||
| Поле | Тип | Описание |
|
||
|------|-----|----------|
|
||
| id | SERIAL | Первичный ключ |
|
||
| user_id | INTEGER | Ссылка на пользователя |
|
||
| first_name | VARCHAR(100) | Имя получателя |
|
||
| last_name | VARCHAR(100) | Фамилия получателя |
|
||
| phone | VARCHAR(20) | Телефон |
|
||
| country | VARCHAR(100) | Страна |
|
||
| city | VARCHAR(100) | Город |
|
||
| street | VARCHAR(255) | Улица |
|
||
| building | VARCHAR(50) | Номер дома |
|
||
| apartment | VARCHAR(50) | Номер квартиры |
|
||
| postal_code | VARCHAR(20) | Почтовый индекс |
|
||
| is_default | BOOLEAN | Адрес по умолчанию |
|
||
| created_at | TIMESTAMP | Дата создания |
|
||
| updated_at | TIMESTAMP | Дата обновления |
|
||
|
||
---
|
||
|
||
## Функции базы данных
|
||
|
||
### `update_updated_at_column()`
|
||
Автоматически обновляет поле `updated_at` при изменении записи.
|
||
|
||
**Использование:** Применяется через триггеры на всех таблицах с полем `updated_at`.
|
||
|
||
### `update_product_rating()`
|
||
Автоматически пересчитывает рейтинг и количество отзывов товара при изменении отзывов.
|
||
|
||
**Логика:**
|
||
- Рассчитывает средний рейтинг из одобренных отзывов
|
||
- Подсчитывает количество одобренных отзывов
|
||
- Обновляет поля `rating` и `review_count` в таблице `products`
|
||
|
||
**Триггеры:**
|
||
- Срабатывает при INSERT, UPDATE и DELETE в таблице `reviews`
|
||
|
||
### `generate_order_number()`
|
||
Автоматически генерирует уникальный номер заказа.
|
||
|
||
**Формат:** `ORD-YYYYMMDD-XXXXXX`
|
||
|
||
**Пример:** `ORD-20240115-000001`
|
||
|
||
**Триггер:** Срабатывает перед INSERT в таблицу `orders`, если `order_number` не указан.
|
||
|
||
### `get_order_status_id(status_slug VARCHAR)`
|
||
Вспомогательная функция для получения ID статуса заказа по его slug.
|
||
|
||
**Возвращает:** INTEGER (ID статуса) или NULL
|
||
|
||
### `get_payment_status_id(status_slug VARCHAR)`
|
||
Вспомогательная функция для получения ID статуса платежа по его slug.
|
||
|
||
**Возвращает:** INTEGER (ID статуса) или NULL
|
||
|
||
### `get_payment_method_id(method_slug VARCHAR)`
|
||
Вспомогательная функция для получения ID способа оплаты по его slug.
|
||
|
||
**Возвращает:** INTEGER (ID способа оплаты) или NULL
|
||
|
||
---
|
||
|
||
## Триггеры
|
||
|
||
### Триггеры обновления `updated_at`
|
||
Автоматически обновляют поле `updated_at` при изменении записи в следующих таблицах:
|
||
- `resources`
|
||
- `actions`
|
||
- `permissions`
|
||
- `roles`
|
||
- `users`
|
||
- `categories`
|
||
- `order_statuses`
|
||
- `products`
|
||
- `addresses`
|
||
- `orders`
|
||
- `cart_items`
|
||
- `reviews`
|
||
- `payments`
|
||
|
||
### Триггеры обновления рейтинга товара
|
||
- **`update_product_rating_on_review_insert`** - после добавления отзыва (если он одобрен)
|
||
- **`update_product_rating_on_review_update`** - после изменения отзыва (если изменился рейтинг или статус одобрения)
|
||
- **`update_product_rating_on_review_delete`** - после удаления отзыва
|
||
|
||
### Триггер генерации номера заказа
|
||
- **`generate_order_number_trigger`** - перед вставкой нового заказа генерирует номер, если он не указан
|
||
|
||
---
|
||
|
||
## Индексы
|
||
|
||
Индексы созданы для оптимизации наиболее частых запросов:
|
||
|
||
### Индексы по slug
|
||
- `resources.slug`
|
||
- `actions.slug`
|
||
- `permissions.slug`
|
||
- `roles.slug`
|
||
- `categories.slug`
|
||
- `products.slug`
|
||
- `order_statuses.slug`
|
||
|
||
### Индексы по внешним ключам
|
||
- `permissions.resource_id`, `permissions.action_id`
|
||
- `role_permissions.role_id`, `role_permissions.permission_id`
|
||
- `users.role_id`
|
||
- `categories.parent_id`
|
||
- `products.category_id`
|
||
- `product_images.product_id`
|
||
- `addresses.user_id`
|
||
- `orders.user_id`, `orders.status_id`, `orders.payment_method_id`, `orders.payment_status_id`
|
||
- `order_items.order_id`, `order_items.product_id`
|
||
- `cart_items.user_id`, `cart_items.product_id`
|
||
- `reviews.product_id`, `reviews.user_id`
|
||
- `payments.order_id`, `payments.payment_method_id`, `payments.status_id`
|
||
|
||
### Индексы по статусам и флагам
|
||
- `resources.is_active`
|
||
- `actions.is_active`
|
||
- `permissions.is_active`
|
||
- `roles.is_active`
|
||
- `users.is_active`
|
||
- `categories.is_active`
|
||
- `products.is_active`, `products.is_featured`
|
||
- `order_statuses.is_active`
|
||
- `payment_methods.is_active`
|
||
- `payment_statuses.is_active`
|
||
- `reviews.is_approved`
|
||
|
||
### Индексы по уникальным полям
|
||
- `users.email`
|
||
- `users.telegram_id`
|
||
- `products.sku`
|
||
- `orders.order_number`
|
||
- `payments.transaction_id`
|
||
|
||
### Индексы для сортировки и фильтрации
|
||
- `products.price`
|
||
- `orders.created_at`
|
||
- `orders.payment_status_id`
|
||
- `reviews.rating`
|
||
|
||
---
|
||
|
||
## Начальные данные (seed_data.sql)
|
||
|
||
### Ресурсы
|
||
- products, orders, categories, reviews, cart, users
|
||
- payments, addresses, roles, permissions
|
||
- * (все ресурсы для администратора)
|
||
|
||
### Действия
|
||
- view, create, edit, delete
|
||
- moderate, manage, view_own
|
||
- * (все действия для администратора)
|
||
|
||
### Права доступа
|
||
Создаются комбинации ресурсов и действий, например:
|
||
- `products.view`, `products.create`, `products.edit`, `products.delete`
|
||
- `orders.view`, `orders.create`, `orders.edit`, `orders.view_own`
|
||
- `categories.view`, `categories.create`, `categories.edit`, `categories.delete`
|
||
- `reviews.view`, `reviews.create`, `reviews.moderate`, `reviews.delete`
|
||
- `cart.manage`
|
||
- `users.view`, `users.edit`, `users.delete`
|
||
- `admin.all` (полные права)
|
||
|
||
### Роли и их права
|
||
|
||
#### Администратор (admin)
|
||
- Все права доступа (`admin.all`)
|
||
|
||
#### Владелец (owner)
|
||
- Все права, кроме управления ролями и правами доступа
|
||
|
||
#### Сотрудник (employee)
|
||
- Просмотр, создание, редактирование, удаление товаров
|
||
- Просмотр и редактирование заказов
|
||
- Полное управление категориями
|
||
- Просмотр, модерация и удаление отзывов
|
||
- Просмотр пользователей
|
||
|
||
#### Менеджер (manager)
|
||
- Те же права, что и у сотрудника
|
||
|
||
#### Клиент (customer)
|
||
- Просмотр товаров и категорий
|
||
- Создание заказов и просмотр своих заказов
|
||
- Управление корзиной
|
||
- Создание отзывов
|
||
|
||
### Статусы заказов
|
||
1. **pending** - Ожидает обработки (#FFA500)
|
||
2. **processing** - В обработке (#4169E1)
|
||
3. **shipped** - Отправлен (#32CD32)
|
||
4. **delivered** - Доставлен (#228B22)
|
||
5. **cancelled** - Отменен (#DC143C)
|
||
6. **refunded** - Возвращен (#8B0000)
|
||
|
||
### Способы оплаты
|
||
1. **card** - Банковская карта
|
||
2. **e-wallet** - Электронный кошелек
|
||
3. **cash_on_delivery** - Наличные при получении
|
||
4. **bank_transfer** - Банковский перевод
|
||
5. **crypto** - Криптовалюта
|
||
|
||
### Статусы платежей
|
||
1. **pending** - Ожидает оплаты (#FFA500)
|
||
2. **paid** - Оплачен (#32CD32)
|
||
3. **completed** - Завершен (#228B22)
|
||
4. **failed** - Ошибка оплаты (#DC143C)
|
||
5. **refunded** - Возвращен (#8B0000)
|
||
|
||
---
|
||
|
||
## Диаграмма связей
|
||
|
||
```
|
||
users ──┬──> roles ──> role_permissions ──> permissions ──┬──> resources
|
||
│ └──> actions
|
||
│
|
||
├──> addresses
|
||
├──> cart_items ──> products ──> categories
|
||
├──> orders ──> order_statuses
|
||
│ └──> order_items ──> products
|
||
│ └──> payments
|
||
└──> reviews ──> products
|
||
```
|
||
|
||
---
|
||
|
||
## Примеры использования
|
||
|
||
### Получение всех прав пользователя
|
||
```sql
|
||
SELECT p.slug, p.name
|
||
FROM users u
|
||
JOIN roles r ON u.role_id = r.id
|
||
JOIN role_permissions rp ON r.id = rp.role_id
|
||
JOIN permissions p ON rp.permission_id = p.id
|
||
WHERE u.id = 1 AND p.is_active = TRUE;
|
||
```
|
||
|
||
### Получение товаров с рейтингом
|
||
```sql
|
||
SELECT p.*, c.name as category_name
|
||
FROM products p
|
||
LEFT JOIN categories c ON p.category_id = c.id
|
||
WHERE p.is_active = TRUE
|
||
ORDER BY p.rating DESC, p.review_count DESC;
|
||
```
|
||
|
||
### Получение заказов пользователя
|
||
```sql
|
||
SELECT o.*,
|
||
os.name as status_name, os.color as status_color,
|
||
pm.name as payment_method_name,
|
||
ps.name as payment_status_name, ps.color as payment_status_color
|
||
FROM orders o
|
||
JOIN order_statuses os ON o.status_id = os.id
|
||
LEFT JOIN payment_methods pm ON o.payment_method_id = pm.id
|
||
LEFT JOIN payment_statuses ps ON o.payment_status_id = ps.id
|
||
WHERE o.user_id = 1
|
||
ORDER BY o.created_at DESC;
|
||
```
|
||
|
||
### Получение элементов заказа
|
||
```sql
|
||
SELECT oi.*, p.name as current_product_name, p.price as current_price
|
||
FROM order_items oi
|
||
LEFT JOIN products p ON oi.product_id = p.id
|
||
WHERE oi.order_id = 1;
|
||
```
|
||
|
||
### Получение корзины пользователя
|
||
```sql
|
||
SELECT ci.*, p.name, p.price, p.stock_quantity, pi.image_url
|
||
FROM cart_items ci
|
||
JOIN products p ON ci.product_id = p.id
|
||
LEFT JOIN product_images pi ON p.id = pi.product_id AND pi.is_primary = TRUE
|
||
WHERE ci.user_id = 1;
|
||
```
|
||
|
||
---
|
||
|
||
## Рекомендации по использованию
|
||
|
||
1. **Безопасность:**
|
||
- Всегда проверяйте права доступа перед выполнением операций
|
||
- Используйте параметризованные запросы для предотвращения SQL-инъекций
|
||
- Храните пароли только в виде хешей
|
||
|
||
2. **Производительность:**
|
||
- Используйте индексы для часто запрашиваемых полей
|
||
- При больших объемах данных рассмотрите партиционирование таблиц `orders` и `order_items`
|
||
- Регулярно анализируйте и оптимизируйте медленные запросы
|
||
|
||
3. **Целостность данных:**
|
||
- Используйте транзакции при создании заказов (заказ + элементы заказа)
|
||
- Проверяйте наличие товара на складе перед добавлением в корзину
|
||
- Обновляйте количество товара на складе при создании заказа
|
||
|
||
4. **Масштабирование:**
|
||
- Рассмотрите возможность добавления таблицы для истории изменений заказов
|
||
- Для больших каталогов товаров используйте полнотекстовый поиск (PostgreSQL tsvector)
|
||
- Кэшируйте часто запрашиваемые данные (категории, популярные товары)
|
||
|
||
---
|
||
|
||
## Версия
|
||
|
||
**Версия базы данных:** 1.0
|
||
**СУБД:** PostgreSQL
|
||
**Дата создания:** 2024
|
||
|
||
---
|
||
|
||
## Лицензия
|
||
|
||
Данная схема базы данных предоставляется "как есть" для использования в проектах интернет-магазинов.
|
||
|