📘Опции продукта
🔧 Обзор архитектуры
В нашей системе цена и скидка не задаются прямо у продукта. Вместо этого продукт содержит коллекцию 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 (опционально, % или ₽)