Перейти к основному содержимому

Модель данных

Предлагаемая модель данных. Это черновик для обсуждения с напарником — имена полей и связи уточняются при реализации в DirectusDirectusOpen-source headless-платформа поверх PostgreSQL: даёт модель данных, REST/GraphQL API, аутентификацию, RBAC и готовую админку без написания кода..

Ключевая идея — brand_id повсюду

Почти каждая бизнес-таблица несёт brand_id (прямо или через связь). На нём строится изоляция тенантовТенантЛогически изолированный клиент в multi-tenant системе. В Ghost Kitchen тенант — это бренд: его данные отделены от других по `brand_id` и правам доступа.: политики доступа фильтруют строки по бренду пользователя.

ER-диаграмма (черновик)

Пояснения к ключевым сущностям

  • brandтенантТенантЛогически изолированный клиент в multi-tenant системе. В Ghost Kitchen тенант — это бренд: его данные отделены от других по `brand_id` и правам доступа.. domain, theme (цвета/лого), settings (валюта, язык, политика checkout).
  • kitchen — локация бренда. Зоны доставки и тайм-слоты живут здесь (а не в платном плагине).
  • menu_itemпозиция менюПозиция менюОтдельное блюдо или товар в меню бренда, доступное для заказа. Может иметь модификаторы и привязку к SKU. на уровне бренда; sku связывает с учётом. kitchen_menu_item — публикация позиции на конкретной кухне с возможностью локальной цены/доступности (стоп-лист).
  • modifier_group / modifierмодификаторыМодификаторОпция, изменяющая позицию меню: добавка, размер, степень прожарки, исключение ингредиента. Может влиять на цену. (размер, добавки) с правилами выбора min/max.
  • order / order_item / order_item_modifier — заказ как снимок: цены фиксируются в момент заказа (unit_price_cents), чтобы последующие изменения меню не меняли историю.
  • payment — платёж в MollieMollieЕвропейский платёжный провайдер. Принимает оплату (карты, iDEAL, Apple/Google Pay и др.) и присылает статус платежа через вебхуки.; provider_payment_id для сверки и идемпотентностиИдемпотентностьСвойство операции давать один и тот же результат при повторе. Защищает от дублей заказа/платежа при повторной доставке вебхука или ретрае. вебхуков.
  • customer — единый клиент на уровне платформы (сквозная аналитика и лояльность).
  • user_role — связка пользователь × роль × область (бренд/кухня) для RBACRBACRole-Based Access Control — управление доступом на основе ролей. Права выдаются роли (Company Admin, Brand Admin, Restaurant Manager), а не каждому пользователю отдельно..

Деньги и время

  • Все суммы — в минимальных единицах валюты (*_cents, целые), чтобы не терять копейки на плавающей точке.
  • Все метки времени — в UTC; в UI переводятся в часовой пояс кухни.

:::warning Открытые вопросы

  • Нужен ли отдельный учёт инвентаря/остатков, или достаточно стоп-листа на кухне?
  • Адреса/зоны доставки — свободный ввод, геокодер или полигоны зон?
  • Нужны ли промокоды/лояльность в MVP или фазой 2? :::