2 модели на одной таблице

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
Wizard
Сообщения: 150
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

2 модели на одной таблице

Сообщение Wizard » 2018.02.10, 14:31

Нужен совет!)) есть товары - модели и оферы, к примеру https://price.ru/planshety/?brand_id=353

модель - карточка товара у которой есть торговые предложения (оферы)
офер - товарное предложение

таблица для них одна отличите в том что у модели parent_id = 0

теоретически ничто не мешает пользоваться одним обьектом, но почему то, интуитивно мне кажется что все же надо разделить их))) так же есть предложение что данными типы не ограничится, появятся зависимости

вариант модели - разновидность модели
- модель - https://market.yandex.ru/product/172768 ... ext=search
- разновидности - https://market.yandex.ru/product/172768 ... &onstock=1
- оферы разновидностей - https://market.yandex.ru/product/172768 ... &onstock=1

вариант офера - разновидность оффера

Но возникает множество вопросов
- как выставить релевантном порядке к примеру по цене список в котором есть и модели и оферы
- как фильтровать список в котором есть и модели и оферы
- стоит ли разделать модели

с ценами есть два варианта (так как и у модели и у офера могут быт разновидности и их цены зависят от потомков) - делать запросы ко всем потомкам в реалтайме, но запрос может оказаться очень жирным или тем же кроном делать пересчет, но это как то сомнительное решение, да и задачу с фильтрации по тем же свойствам не решает

Nex-Otaku
Сообщения: 809
Зарегистрирован: 2016.07.09, 21:07

Re: 2 модели на одной таблице

Сообщение Nex-Otaku » 2018.02.10, 20:41

Делаете три таблицы.
1. товар - общие атрибуты
2. модель - ID товара и атрибуты модели.
3. офер - ID товара и атрибуты офера.
- как выставить релевантном порядке к примеру по цене список в котором есть и модели и оферы
Если цена в общей таблице, то банальная сортировка, если в дочерних, то джойн и опять сортировка, чуть сложнее.
- как фильтровать список в котором есть и модели и оферы
Аналогично описанному выше - вам доступны поля общей таблицы сразу, дочерние через джойн. Ничего не мешает приджойнить обе таблицы и получить в распоряжение условий SQL все колонки и моделей и оферов.
- стоит ли разделать модели
В смысле, делать разные классы для оферов и моделей? Это вам решать ) Но как правило подход "всё в одном классе" ведёт к очень быстрому переусложнению кода.

Поэтому рекомендую разделять классы сопоставляя с бизнес-требованиями. Если у вас по логике бизнеса "модель" и "офер" - это разные штуки, имеющие собственные поведения, то нужно разделять.

Самый простой признак, что вам нужно разделять классы, если в вашем коде появляются подобные условия:

Код: Выделить всё

if ($item->isOffer) {
...
}
if ($item->isModel) {
...
}
P.S. Разделение можно и в пределах одной таблицы замутить, но на мой взгляд, это так себе вариант:
https://github.com/samdark/yii2-cookboo ... ritance.md

Ответить