Насколько производительна схема характеристик товара где значения характеристик хранятся в двух JSON полях (значение характеристик и их структура?

Очень долго искал альтернативу EAV для интернет-магазина на Django. Стояла задача не просто реализовать переменное количество атрибутов товаров но и реализовать их упорядочивание и вложенность в группы атрибутов а именно:
товар может принадлежать к нескольким категориям. Порядок категорий важен так как в них определены группы атрибутов характерные для каждой категории. Внутри групп атрибутов определены атрибуты которые могут быть нескольких типов по типу данных - число, текст, одно значение из списка, набор значений из списка. Просто одно поле JSON хороший вариант но он описывает произвольное количество атрибутов но не задает их порядок и вложенность. Пришлось колхозить два. На скринах показано какая структура данных в них.
parameters = models.JSONField: Ключ это id_группы атрибутов - id_атрибутов (атрибут может иметь разное значение в зависимости от того к какой группе атрибутов относится).
5ff74b9a7a184799170935.png
parameters_structure = models.JSONField
5ff74bef7516d118956959.png
Написан виджет для адимнки:
class ProductAttributesField(forms.MultiValueField) который выглядит так
5ff74cb967622806552207.png
.
Вложенность определяется таблицами и связями между ними:
Product, Category, ProductInCategory, AttrGroup, AttrGroupInCategory, Attribute, AttributesInGroup, AttributeValue (варианты фиксированных значений для выбора)
Эти таблицы нужны по сути для адмимнки ну и хранят названия самих этих сущностей. Выглядит это так:
В форме товара (инлайны категорий можно перетаскивать для смены порядка категорий)
5ff74ef12b2d5017356884.png

список категорий:
5ff74f565a784393047965.png

в форме редактирования категории:
5ff74f777c1eb589218331.png

Редактирование группы атрибутов:
5ff74fb7680cd985125505.png

Редактирование атрибута товара:
5ff74ff97c63d492130429.png

В интерфейсе администратора выглядит все как EAV но под капотом при любом изменении в структуре данных (добавили атрибут к группе атрибутов, изменили порядок следования категорий) происходит перезапись поля parameters_structure каждого связанного товара. Все ради того чтобы можно было обратится только к parameters товара при выборке и фильтрации товаров и к parameters и parameters_structure при отрисовке характреистик товара.
Эту логику сейчас реализовал в SAVE и DELETE промежуточных таблиц (ProductInCategory, AttrGroupInCategory, AttributesInGroup) но в процессе перенос в оттуда в формы измнения самих моделей (Product, Category, AttrGroup)

Работы еще много а оправдано ли? Получу ли я выигрыш в скорости по сравнению с EAV, а может было и решение проще?
  • Вопрос задан
  • 161 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы