Модель данных
Предлагаемая модель данных. Это черновик для обсуждения с напарником — имена полей и связи уточняются при реализации в 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? :::