Files
new.rybstock.ru/docs/ШАГ_2_БАЗА_ДАННЫХ.md
T
2026-06-04 00:27:17 +03:00

177 lines
6.5 KiB
Markdown

# Шаг 2. База данных и связи
## Что сделано
Создана SQL-схема `database/schema.sql` для MariaDB/MySQL и стартовые данные `database/seed.sql`.
Также создана локальная страница установки `public/install.php`.
Она применяет:
- `database/schema.sql`;
- `database/seed.sql`.
Важно: установка пересоздает таблицы, поэтому использовать ее только на старте или в локальной разработке.
Схема покрывает основные части проекта:
- администраторы;
- категории и подкатегории;
- товары;
- фасовки и цены;
- изображения товаров;
- поисковые термины;
- промокоды и их привязки;
- расчеты доставки;
- заказы и позиции заказов;
- история статусов заказа;
- вход клиента по email-коду;
- отзывы;
- акции;
- популярные товары;
- настройки сайта;
- праздничные/нерабочие дни.
- старые URL и 301-редиректы для сохранения индексации.
## Главная логика связей
### Категории
Таблица `categories` поддерживает вложенность через `parent_id`.
Это позволяет хранить:
- главные категории;
- подкатегории;
- меню каталога;
- SEO-текст для страниц категорий.
Для переноса со старого сайта у категорий есть поле `legacy_path`. Если старый URL отличается от нового slug, старый путь нужно сохранить и добавить 301-редирект в таблицу `redirects`.
Для SEO у категорий есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`.
### Товары
Таблица `products` хранит основную карточку товара:
- название;
- slug;
- категорию;
- описание;
- основное фото;
- базовую единицу;
- режим отображения цены;
- публикацию;
- доступность;
- признаки "новинка", "хит", "акция".
Для товаров также есть поле `legacy_path`, чтобы переносить старые ссылки без потери индексации.
Для SEO у товаров есть поля `h1`, `seo_title`, `seo_description`, `seo_keywords`.
### Фасовки
Таблица `product_variants` хранит отдельные фасовки товара.
Именно фасовка попадает в корзину, а не просто товар.
Пример:
- товар: горбуша неразделанная;
- фасовка: пласт 10 кг;
- `package_quantity`: 10;
- `step_quantity`: 10;
- `price_per_unit`: 600;
- `package_price`: 6000.
Так можно корректно сделать плюс/минус кратно фасовке.
### Заказы
Таблица `orders` хранит заказ целиком:
- имя;
- телефон;
- email;
- тип получения;
- адрес;
- суммы;
- промокод;
- расчет доставки;
- статус.
Таблица `order_items` хранит снимок каждой позиции заказа.
Снимок нужен, чтобы старые заказы не менялись при изменении цены или названия товара в каталоге.
### Промокоды
Таблица `promocodes` хранит сам промокод.
Таблица `promocode_targets` хранит ограничения:
- на категорию;
- на товар.
Если промокод действует на весь заказ, targets не нужны.
Для отображения выгодных цен в каталоге у промокодов есть поля:
- `show_in_price_tiers` - показывать как градацию цены;
- `price_tier_label` - подпись для карточки товара.
Так можно показывать покупателю базовую цену, цену от 20 000 руб. наличными и цену от 50 000 руб. наличными.
### Доставка
Таблица `delivery_calculations` хранит результат расчета:
- тип доставки;
- адрес;
- сумма заказа;
- расстояние от МКАД;
- порог бесплатной доставки;
- стоимость доставки;
- стоимость подъема;
- объяснение расчета.
Это нужно, чтобы в заказе сохранялся расчет, который видел клиент.
### История заказов по email
Таблица `customer_login_codes` хранит одноразовые коды входа по email.
SMS не используются.
### Настройки
Таблица `site_settings` хранит настройки сайта:
- телефон;
- email администратора;
- правила доставки;
- температуры камер;
- тексты и числовые параметры.
## Как применить схему
1. Открыть в браузере `/install.php?token=rybstock-local-install`.
2. Нажать кнопку "Создать таблицы и стартовые данные".
3. После успешной установки база будет содержать таблицы проекта и стартовые категории/настройки.
Страница работает только при `APP_ENV=local` и правильном `INSTALL_TOKEN` из `.env`.
## Что нужно сделать следующим шагом
Шаг 3:
1. Создать базовые PHP-классы для работы с таблицами:
- `CategoryRepository`;
- `ProductRepository`;
- `ProductVariantRepository`;
- `OrderRepository`;
- `PromocodeRepository`;
- `SettingRepository`.
2. Сделать первый вывод категорий на главной странице.
3. Подготовить основу админки: вход администратора и список разделов.