Skip to main content

📘Опции продукта

🔧 Обзор архитектуры

В нашей системе цена и скидка не задаются прямо у продукта. Вместо этого продукт содержит коллекцию ProductOptions, каждая из которых:

  • Указывает тип опции (например, размер) [опционально]
  • Содержит ссылку на цену
  • Содержит ссылку на скидку [опционально]

Таким образом мы отделяем данные о ценах и скидках от конкретного продукта — это снижает дублирование и упрощает обновления.

💡 Почему цена и скидка не указываются напрямую

  • Многие товары могут иметь идентичную цену → при прямом хранении придётся менять цену везде.
  • С помощью ссылочной модели достаточно обновить запись в прайс-листе, и цена обновится у всех товаров, с ними связанных.
  • Аналогично работает и система скидок.

Опции продукта позволяют гибко управлять различными вариантами одного и того же продукта, такими как размеры, объёмы и другие характеристики.

Пример таблицы цен

НазваниеЦена (₽)
Пицца маленькая500
Пицца средняя700
Пицца большая900

Изменив цену в таблице, автоматически обновятся все связанные опции продукта.

Пример таблицы скидок

НазваниеТипЗначение
Скидка на лето%25
Скидка «Успей купить»299
Обычная скидка%−7

Что такое ProductOptions

Объект ProductOptions описывает все доступные вариации продажа продукта (разное сочетание значений: размеры, объёмы | цены | скидки):

  • Каждый вариант (опция) имеет свою цену и (опционально) скидку и (опционально) тип опции.
  • Позволяет гибко управлять ассортиментом и акциями на уровне отдельных вариантов.

Тип опции (OptionType)

OptionType определяет, что представляет собой данная опция в интерфейсе.

Пример списка OptionType:

OptionTypeIdНазваниеЗначение
1Пицца маленькая20 см
2Пицца средняя30 см
3Пицца большая40 см

Пример структуры ProductOptions

"ProductOptions": [
{
"optionTypeId": 1,
"priceId": 1,
"discountId": null
},
{
"optionTypeId": 2,
"priceId": 2,
"discountId": null
},
{
"optionTypeId": 3,
"priceId": 3,
"discountId": 2
}
]

Связи в структуре

  • optionTypeId связывает опцию с её описанием (например, «большая»)
  • priceId — ссылка на сущность с ценой
  • discountId — ссылка на сущность со скидкой (если имеется)

Преимущества модели

Централизованное управление ценами

Обновление одной записи меняет цену во всех связанных вариантах.

Минимизация дублирования

Нет необходимости дублировать значения в каждом продукте.

Гибкое применение скидок

Скидки можно назначать отдельно на каждую опцию продукта.

Масштабируемость

Легко добавлять новые варианты без изменения остальной архитектуры.

Итоговая схема данных

Product
└─ ProductOptions[] (массив объектов)
├─ optionTypeId → OptionType (опционально, имя и отображение)
├─ priceId → Price (значение цены))
└─ discountId → Discount (опционально, % или ₽)