Архитектура БД для доставки еды на Laravel
При разработке пет-проекта доставки еды на PHP и Laravel правильно спроектированная база данных - основа стабильной работы. Рассмотрим ключевые таблицы, связи и типичные ошибки, которые допускают новички. Вы узнаете, как организовать хранение товаров, заказов, корзины и бонусной системы, а также когда оправдано использование UUID.
Основные таблицы для сервиса доставки
Минимальный набор таблиц включает: users (пользователи), products (товары/блюда), categories (категории), orders (заказы), order_product (связь заказов и товаров), cart (корзина), cart_product (товары в корзине), bonuses (бонусы), product_statuses (статусы товаров: хит, новинка, скидка).
Таблица product_statuses - гибкая система меток
Отдельная таблица для статусов товаров - хорошее решение. В ней можно хранить название статуса (например, «Хит продаж»), тип (скидка, новинка) и значение (процент скидки). Это позволяет легко добавлять новые метки без изменения схемы БД. Связь с products реализуется через внешний ключ status_id.
UUID в таблицах: когда это нужно?
Вы планируете использовать UUID в users, orders, order_product, bonuses, cart, cart_product. Это оправдано для бизнес-критичных данных: UUID защищает от подбора идентификаторов и упрощает миграцию между серверами. Однако помните: UUID увеличивает размер индексов и замедляет запись. Для таблиц-связок (order_product, cart_product) можно оставить автоинкремент - это снизит нагрузку.
Поле address в orders - обязательный элемент
Вы заметили, что забыли про адрес доставки. В таблице orders обязательно должны быть поля: address (текст), city_id (если работаете по городам), delivery_time (время доставки). Также добавьте status_id для отслеживания этапов заказа (новый, готовится, в пути, доставлен).
Проверка архитектуры: что ещё учесть?
- Индексы: создайте составные индексы для частых запросов - например, (user_id, created_at) в orders.
- Транзакции: при оформлении заказа используйте транзакции для согласованного обновления корзины и бонусов.
- Мягкое удаление: в Laravel удобно использовать SoftDeletes для users и products, чтобы не терять данные.
- Цены: храните цены в копейках (integer), чтобы избежать проблем с плавающей точкой.
Часто задаваемые вопросы по БД доставки еды
Ниже - ответы на популярные вопросы, которые помогут избежать типичных ошибок при проектировании.