Произвольные фильтры, параметры для разных типов продукции и поиск по ним. БД проблем

DpoHro

Новичок
Произвольные фильтры, параметры для разных типов продукции и поиск по ним. БД проблем

Честно сказать не знаю как толковее назвать тему ))
Вопрос скорее по БД.

Есть некоторые типы продукции, у каждого типа свой набор параметров.
Например, есть некоторые продукты (в широком смысле )) ).
При создании таких продуктов в БД им задаются, как правило, разные параметры (характеристики), а их набор может быть у каждого типа продукта свой и может изменяться.
Нужно сделать универсальную в этом плане систему, чтобы небыло необходимости создавать под каждый тип продукта таблицу со своими параметрами да и с изменением свойств таких параметров я думаю тоже все ясно (лезем в БД), а так же чтобы не нужно было вручную писать запросы под каждый поиск(крайне желательно) )).

Параметры выносим естесственно в другую таблицу, которая связывается с типом продукта.

Чойто я напридумал (простите за мой метаязык в описании таблиц):

table_product_type {id, name}

table_product {id, typeId, name}

table_variable {
id,
productTypeId, // ид типа продукта
typeId // тип переменной (целое, с плав. точкой, выбор из списка, строка)
}

table_variables_values { // таблица со списками возможных значений для переменной типа "выбор из списка"
id,
variableId, // для какой переменной это значение
value, // значение присваиваемое переменной
name // семантика
}

table_product_variable_filters {
id,
variableId,
filterType, // тип фильтра (>,<,>=,<=,!=)
valueInt, // точное значение (int) это же поле можно пользовать если переменная выбор из списка, тогда тут id выбранного параметра
valueFloat, // точное значение (float)
intMin,
intMax,
floatMin,
floatMax
}

Это то что мне приблизительно видится, однако не могу теперь придумать как это все использовать при фильтрации, то есть чето мне запрос не придумать к такой структуре таблиц (((
Поможите люди добрые советом, верной ли дорогой иду и быстро ли такое будет работать?

Тема наверняка довольно широкая, поиск чувствую мне не дает результатов потому, что не знаю как это все назвать и что искать.
 

prolis

Новичок
поиск по двум параметрам:
[sql]
select good_id
from property_good
WHERE (property_id=1 and property_value='A') or (property_id=2 and property_value='B')
group by good_id
having count(property_id)=2
[/sql]
 

DpoHro

Новичок
А вот скажи мне пожалуйста,
как составить запрос, чтобы применить фильтр.

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

Мне нужно выбрать продукты которые обладают свойствами что ты выбрал в своем запросе и еще одним - ценой, фильтр по которой хранится в таблице двумя записями:
min 10000 max 500000
min 3000000 max 10000000
нужно эти условия соблюсти.

Вот такая у меня задачка
 

prolis

Новичок
[sql]
SELECT good_id
FROM property_good
WHERE (property_id = 1 AND property_value = 'A')
OR (property_id = 2 AND property_value = 'B')
or (property_id = 'min1' AND property_value < [SUM_CREDIT])
or (property_id = 'max1' AND property_value > [SUM_CREDIT])
GROUP BY good_id
HAVING count( property_id ) = 4
[/sql]
"мне нужно задать минимальное и максимальное значение, оно по каждой программе кредитной разное" - это два разных продукта, у них good_id будет разный
 

DpoHro

Новичок
Чтото не то ...
Мне кажется все таки должно быть какое то участие таблицы фильтров в запросе, так как они (фильтры) в каждом продукте на один и тот же параметр разные, иначе бы я эти фильтры делать отдельно не стал. Еще их на каждый параметр продукта может быть N ))
 

prolis

Новичок
ну приведи пример-то, особенно с N фильтров на продукт.
Достаточно одного фильтра по всем свойствам продукта с отключением неиспользуемых.
 

DpoHro

Новичок
Пример: ипотека

параметры:
- сумма (число)
- срок (число, лет)
- тип объекта {выбор из списка, варианты: вторичное жилье, сданные новостройки, долевое участие}

ипотека 1 от банка 1:

фильтры:
сумма от 1000000 до 3000000
срок от 5 до 20 лет
тип объекта: {вторичное жилье, новостройки}


ипотека 1 от банка 2:

фильтры:

сумма (внимание!, либо ... либо..., в сумме кредита это врядли встретится но может быть в других параметрах ):
от 500000 до 1000000
от 2000000 до 5000000
то есть 2 фильтра на 1 параметр

срок от 5 до 20 лет
тип объекта: {вторичное жилье, новостройки}


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

-~{}~ 27.08.10 14:59:

эти фильтры я ввел исключительно для поиска и вывода списка подошедших пользователю программ, как это делается например на banki.ru

-~{}~ 27.08.10 15:07:

мне кажется JOINы нужны фильтров к таблице параметров ?
Но как их грамотно задействовать, там еще тип фильтра, а это либо IF (которым я не очень умею пользоваться) либо на каждый тип условие в WHERE через OR )) ?
 

prolis

Новичок
1.нет никаких фильтров продукта.
Есть запрос: ипотека/1000000 руб/10 лет
Есть параметры продукта: ипотека/от 500000 до 5000000 руб/от 5 до 15 лет
Все, проверяем с помощью SQL соответствие запросу продуктов.
2. "внимание!, либо ... либо..., в сумме кредита это врядли встретится но может быть в других параметрах " - {вторичное жилье, новостройки} это и есть либо либо, две записи в параметрах продукта.

-~{}~ 27.08.10 15:42:

[telepat_mode=on]
Если тебя на самом деле интересует вопрос вхождения одного диапазона в другой, например если запрос диапазона от 50 до 150, а в базе есть продукт с границами от 100 до 200, то это тоже легко вычисляется. Для этого на бумаге нужно нарисовать ось с цифрами, нанести значения и составить запрос.
 

DpoHro

Новичок
Вхождение интересует в один из промежутков (объединение) пересечения это уже сложновато ))

А зачем мне фильтры понадобились? Ну или условия для параметров, можно и так назвать.
Да потому, что каждый банк устанавливает свои диапазоны да еще у каждой программы они разные, тут никак не воспользоваться предопределенными параметрами. Или я все еще не понимаю что ты мне хочешь сказать... Да еще и их может быть не один а 2 на один параметр продукта.
 

prolis

Новичок
Ты же расписал выше основные параметры продуктов: сумма, срок, что-то ещё. Сумма и срок либо в виде диапазона (Vmin, Vmax) либо фиксированные (Vmin=Vmax). Таким образом ты по продуктам всех банков можешь искать однообразно путем поиска пересечений диапазона запроса с диапазонами параметров.
Далее, если у банка разные программы кредитования, то это разные продукты, которые аналогично заносятся в БД.
В тех случаях, когда параметр (тип недвижимости) имеет несколько значений (вторичное жилье, новостройки), значит и в таблице значений появятся две записи с одним Id свойства, алгоритм поиска которых зависит от логики (и/или).
 

DpoHro

Новичок
Набор параметров привязывается к типу продукта (ипотека), а не к продукту.
Параметр в таблице параметров описывается семантикой и типом этого параметра, а уже область допустимых значений описывается таблицей фильтров.
Мне кажется надо было сказать что такое таблица values в моем понимании.
Это перечень всех возможных значений параметра, если это список, не более. Для каждой программы из него отбирается подмножество возможных значений. Таким образом таблица фильтров выступает своеобразным кроссом между таблицей таблицей с продуктами и параметром с одной стороны и таблицей возможных значений с другой.

>>> Далее, если у банка разные программы кредитования, то это разные продукты, которые аналогично заносятся в БД.
Да верно каждая программа - это продукт. Таблица значений это которая? Я ее не описывал.
 
Сверху