Нужно продумать структуру

В процессе создания нескольких сайтов столкнулся вот с какой проблемой. Есть различный контент и к контенту нужно подключать различные параметры (доп. поля). Например, имеем интернет магазин. Нам нужно для Товаров следующие доп. параметры: Производитель, Цвет, Размер. Производитель и цвет это что-то вроде тегов, но они разного типа. Поэтому, задумался как лучше всего реализовать подобную структуру: Контент-Доп.параметры. Для другого сайта, например, для автокаталога, нам тоже нужен параметр Производитель. И хотелось бы использовать однотипный функционал (CRUD) для данных доп.параметров на разных сайтах. Т.е. нужно сохранение, валидацию и прочее реализовать в одном модуле. В идеале хочется просто указывать, что вот для этой модели нам нужен такой-то параметр и при сохранении или валидации модели, будет автоматом сохраняться, валидироваться наш параметр.

Как бы вы реализовали подобное? Нужно что-то похожее на таксономию (как в Drupal) [в экстеншенах, кстати, был модуль таксономии, но ссылки на скачивание сейчас удалены].

Интересует как общая структура (как организовать БД), так и Yii реализация (как подключать, с пом. behavior или еще как)?

Мне одному кажется, что вы на пути к страшной и ужасной модели EAV? :)

Можно хранить доп параметры к каждому типу товара в сериализованном виде в бд, а в afterFind / beforeSave - собирать / разбирать инфу

Боюсь, EAV не совсем мне подходит, так как накладывает ограничения (по производительности, во-первых) на поиск и выборку данных.

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

Я не совсем понимаю вашу проблему. Почему просто не создать дополнительное поле "цвет" в таблице (кстати, товары могут быть и разных цветов)? Если у товара есть производитель, то наверняка потребуется внешний ключ на таблицу производителей. Мне кажется, вы зачем-то всё чересчур хотите усложнить.

Да, наверное, вы правы :) Усложняю все-таки))

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

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

Или серилозовать массив параметров или сделать дополнительную таблицу с параметрами контента.


+------------+------------+-------------+

+   parent   +    name    +    value    +

+------------+------------+-------------+

+     1      +    color   +   #ff0000   +

+------------+------------+-------------+

+     1      +    price   +     45      +

+------------+------------+-------------+

Я думаю у тех, кто пишет под Yii постоянно есть такой модуль. У меня есть, вот только не совсем модуль… просто контроллер, модель, шаблоны и виджет вывода категорий.

Если у вас к примеру каталог товаров, то структуру свойств товаров лучше определять на уровне раздела/подраздела с использование конфигурационного массива для построителя CForm: http://www.yiiframework.com/doc/guide/1.1/ru/form.builder

Далее к примеру создаем мы товар в определенной категории, вытаскиваем из категории структуру формы - строим ее, заполняем нужные параметры и сохраняем к примеру в виде JSON в поле params в таблицу продуктов. Спросите почему JSON - а потому что можно будет потом с помощью SQL’я выбирать товары по параметрам, диапазону параметров и т.п. - очень удобно - чего не сделаешь нормально с выводом serialize()

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

Для этого не нужно создавать модуль - у модуля как правило есть контроллер, модель и т.д.

Можно просто создать класс (компонент) который будет делать следующие вещи:

  1. С помощью CForm выводить - строить форму внутри наших других форм в модулях (в форме редактирования продукта, страницы, чего-нибудь еще где нужны доп. свойства)

  2. к примеру в beforeSave() мы будем вызывать специальный метод нашего класса который будет получать на вход массив $_POST[‘params’] и выдавать json_encode который мы запишем в аттрибут под именем params к примеру.

вот и все )

единственный сложный тут момент - это создать нормальный интерфейс конструктора параметров для категории товаров + если нужна вложенность параметров - реализовать ее на уровне описанной выше логики.

по выделенному: как можно sql запросом делать выборку используя те параметры которые сохранены в виде json в отдельном поле таблицы ? не совсем понятно.