Files
2025-12-07 13:34:02 +03:00

758 lines
32 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Документация базы данных интернет-магазина
## Описание проекта
База данных для интернет-магазина на 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
---
## Лицензия
Данная схема базы данных предоставляется "как есть" для использования в проектах интернет-магазинов.