PDA

Просмотр полной версии : Зависимые фильтры



deBeer
29.05.2010, 18:45
Здравствуйте.

Сразу скажу, что я новичек, потому прошу совета. Я учусь не на программиста, знаний серьезно не хватает, и спросить не у кого :(

Делаю фильтры, наподобие этих: http://www.arredo.ru (сверху)

Значения берутся в любом порядке, после каждого выбора происходит пересчет количества товаров (нод).

К примеру, есть 5 фильтров, в каждом 5 возможных значений. То есть есть массив атрибутов:

A1: 0, 1, .. , 5;
...
A5: 0, 1, .. , 5;

Каждая нода (товар) имеет от 1 до 5 атрибутов, у каждого атрибута от 1 до 3 значений. К примеру такой массив описывает одну ноду:

[A1: [2], A2: [1, 4], A3[1], A4[1, 2, 5], A5[5] ]; -- Тут присутствуют все 5 атрибутов, но их может быть и меньше.

Я подумал что проще всего будет получить массив разных комбинаций атрибутов, типа:

Arr1 = ["1:2:3:4:5": 3]; Что значит что 3 ноды имеют комбинацию атрибутов A1=1; A2=2;.. A5=5;
Таким образом решить задачу получилось, но есть огромный минус.
Если у каждой ноды всего от 1 до 5 атрибутов, т.е.A1=1; A2=2;.. A5=5; - то все ок, массив Arr1 будет иметь столько же элементов, сколько есть нод.

Но если все большее число нод будет иметь несколько атрибутов, т.е. все чаще будут попадаться ноды с примерно такими атрибутами: [A1: [1, 2, 3], A2: [1, 2, 4], A3[1, 2, 3], A4[1, 2, 5], A5[1, 3, 5] ]; - то этот массив Arr1 будет разрастаться адскими темпами, а поиск в нем будет все затратнее.

Так как в будущем число нод будет быстро расти, этот способ очень плохой.

Второй вариант лучше, так как в будущем могут добавиться всего несколько атрибутов, а его быстродействие зависит именно от число атрибутов.

Напомню, у нас есть 5 атрибутов, у каждого по 5 значений, то есть всего получим массив размером 5^5 = 3125 элементов.

[n1, n2, ..., n3125] где ni - это число нод с такой комбинацией атрибутов. Я думаю это лучше, чем 5-мерный массив, если продумать способ заполнения массива. (Стоит заметить, что 5x5 это для простоты счета, на самом деле число элементов будет где-то 600 тысяч, или 7-мерный массив).

Вопрос в том, как правильно решаются такие задачи? Может быть есть подобные готовые решения, чтоб вникнуть в них и разобраться? Будьте добры, подскажите.

NecoMeco
30.05.2010, 14:00
Возможно я неправильно понял вопрос... но все же..

Обычно есть некоторая база данных (к примеру Oracle), в базе хранятся все объекты ("диваны") и их атрибуты - описание к ним ("изготовитель", "материал", "цена"). Обычно база находится в 3 нормальной форме т.е. все атрибуты вынесены в отдельные таблицы. При помощи SQL запроса можно получить из базы список всех возможных значений атрибутов (вроде SELECT * FROM диваны.материал) и таким образом получить все значения для фильтра по материалу. Далее... Когда пользователь выбирает какой либо фильтр мы посылаем еще один SQL запрос вроде (SELECT * FROM диваны WHERE материал = "дерево") и получаем уже более урезанный список объектов. Таким же образом делается обработка для нескольких слов фильтра (см. хранимые процедуры sql).

таким образом решение задачи с фильтрами сводится к обработке SQL запроса.