Архитектура БД для доставки еды на 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), чтобы избежать проблем с плавающей точкой.

    Часто задаваемые вопросы по БД доставки еды

    Ниже - ответы на популярные вопросы, которые помогут избежать типичных ошибок при проектировании.

    Часто задаваемые вопросы