Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Многокритериальный поиск   Найти похожие ветки 

 
databaser   (2007-03-09 21:23) [0]

Есть порядка 10+ критериев поиска информации в БД. Таблиц порядка 9, много связей. Структуру пока не привожу, может и не понадобится.

Ранее я использовал TADOQuery и генерировал запрос в динамике (хранил targets / sources / conditions в массивах + рекурсия. запрос делал в виде SELECT * FROM Table1 WHERE ID IN (SELECT ... 1критерий WHERE ID IN (SELECT ... 2критерий WHERE ID IN (...)) - уж не знаю насколько правильный подход, в БД не силен.

Теперь же я перешел на хранение запросов непосредственно в mdb. Понятное дело использую параметризированные запросы. Но в итоге столкнулся с тем (мастера начинают вежливо хихикать), что пришлось делать batch создание... ну тут немного комбинаторики... в общем создание порядка 100 запросов.

Мне кажется это не особо разумным. Есть ли иные выходы из ситуации?


 
Sam Stone ©   (2007-03-10 00:01) [1]

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


 
MsGuns ©   (2007-03-10 00:03) [2]

>Есть ли иные выходы из ситуации?

Объяснить пользователям основы SQL или научить пользоваться мастерами в самом акцесе


 
databaser   (2007-03-10 07:25) [3]

MsGuns ©   (10.03.07 00:03) [2]
Отпадает сразу. Конечный пользователь не является оператором среды MS Access и даже может не иметь его установленным на машине. Но как иной выход "засчитываю" ) Еще варианты?

Sam Stone ©   (10.03.07 00:01) [1]
Сложности со снятием дампа структуры с этой базы возникли. Причину так и не понял. К сожалению от руки и самое важное.

cTable(cID, ...);
AdTable(AdID, cID, ..., s);
pTable(pID, AdID, cID, ..., o);
oTable(oID, ...);
rTable(rID, cID, AdID, ..., ru);
ruTable(ruID, ...);
sTable(sID, ...);

Пример поиска - получить все cID, для которых верно (ruTable.SomeField Like "%1%") AND (sTable.SomeField Like "%2%") AND (pTable.SomeField Like "%3%"). Понятное дело используется INNER JOIN для "состыковки" по индексам, я лишь привел пример поиска по трем критериям.


 
MsGuns ©   (2007-03-10 14:06) [4]

>databaser   (10.03.07 07:25) [3]
>Еще варианты?

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

Любая "нормальная" БД описывает ОБЪЕКТЫ РЕАЛЬНОЙ ЖИЗНИ, имеющие определенные СВОЙСТВА. И поиск, собственно, являются лишь средством обнаружения и отображения объектов, имеющих определенные (заданные) свойства.
От этого и надо плясать. Если же ваш "объект" сидит на 9 таблицах, связанных между собою целой алгеброй, то "ошибка в консерватории"


 
Anatoly Podgoretsky ©   (2007-03-10 16:52) [5]

> MsGuns  (10.03.2007 14:06:04)  [4]

Квадратный конь в ваккуме
 "MsGuns" <msguns@ukr.net> wrote in message
news:1173464588.4@delphimaster.ru...
 MsGuns © (10.03.2007 14:06) [4]
 >databaser   (10.03.07 07:25) [3]
 >Еще варианты?

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

 Любая "нормальная" БД
описывает ОБЪЕКТЫ
РЕАЛЬНОЙ ЖИЗНИ, имеющие
определенные СВОЙСТВА. И
поиск, собственно,
являются лишь средством
обнаружения и отображения
объектов, имеющих
определенные (заданные)
свойства.
 От этого и надо плясать.
Если же ваш "объект" сидит
на 9 таблицах, связанных
между собою целой
алгеброй, то "ошибка в
консерватории"


 
Desdechado ©   (2007-03-10 18:27) [6]

MsGuns ©   (10.03.07 14:06) [4]
+1

Все запросы и поиски имеют реальное отображение на задачи из предметной области. А комбинаторные поиски по БД вряд ли имеют смысл в реальной жизни, не считая специфических задач, для которых есть вполне формальная постановка, а не "хочу найти все, что ищется".


 
databaser   (2007-03-10 22:25) [7]

Могу пояснить более подробно.

БД хранит информацию о некоторых предприятиях области. У каждого преприятия может быть несколько филиалов и общая информация для всей конторы (название, эл.почта, сайт и прочее). Каждый филиал представлен адресом, телефоном + доп. инфа (к примеру категория, к которой относится филиал). Отдельно выделены справочники: улиц, категорий, "владельцев" телефонов.

Это реальное отображение на предметной области. БД проектировал в ERWin"e, потом генерировал.

Пример комбинаторного поиска: ищем по улице + категории + сайту, к примеру. Т.к. база не малая, то значимость фильтрации данных для выделения необходимой информации конечному пользователю на прямую зависит от указанных критериев.

Помогите разобраться. Я интуитивно чувствую, что "родил монстра".

MsGuns ©   (10.03.07 14:06) [4]
Desdechado ©   (10.03.07 18:27) [6]
Извините, что сразу не расписал задачу, может быть стало более понятно бы.

Anatoly Podgoretsky ©   (10.03.07 16:52) [5]
Подходящее название для "монстра".

С уважением.


 
Desdechado ©   (2007-03-11 18:03) [8]

Как вариант, конструировать запрос "на лету". Хранить такое в виде ХП смысла не вижу, на все не напасешься. И рекурсия тут тоже нафиг не нужна.
Просто, например, делать что-то такое:
c:="SELECT нужные_поля_из_главной_таблицы"
если нужны поля из T1, то
 с:=c+"поля_из_T1";
... // + по всем вспомогательным таблицам
c:=c+"FROM главная_таблица";
если нужны поля из T1, то
 c:=c+", T1";
... // + по всем вспомогательным таблицам
если нужны поля из T1, то
 c:=c+"главная_таблица.ключ = T1.ключ";
... // + по всем вспомогательным таблицам


 
databaser   (2007-03-11 22:36) [9]

Desdechado ©   (11.03.07 18:03) [8]
Рекурсия ничем толком не отличается от того append"a строк что вы предлагаете, окромя читабельности. Но это не суть - рекурсию то я использовал для другой структуры запроса, где она была уместна. В вашем варианте ей не место это точно.

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

Теперь по поводу использования SP. Мне необходимо минимизировать время уходящее на запрос. Если я использую вариант с динамической генерацией - получаю "ужас". Если параметризированный запрос, то надо заготавливать кучу готовых, заранее сгенерированных, запросов и хранить их либо в куче TADOStoredProc, либо в mdb и использовать 1 SP.

1) В первом случае "лишнее" время тратится на закрытие датасета, парсинг SQL запроса.

2) Во втором случае все идеально, окромя нескольких десятков SP...

3) В третьем нету парсинга, но имеет место закрытие датасета, которое жрет прилично судя по результатам профилирования.

Относительно задачи. Конечный пользователь часто выполняет запросы, как с одним критерием (тут проблем нету), так и с несколькими. Запросы могут повторяться и т.д. В общем пользователь в полную силу использует все информационные ресурсы БД.


 
MsGuns ©   (2007-03-11 23:50) [10]

>databaser   (11.03.07 22:36) [9]

Повторяю еще раз:

Для задачи, котрую Вы описали, не может быть сложного поиска, а если он все-таки "вытанцовывается", то либо учить сиквель до изнеможения, либо база спроектирована из рук вон


 
Sergey13 ©   (2007-03-12 08:28) [11]

Теоретически наверное можно написать 1 запрос с фильтрами типа
(:par1 is null or Field1=:par1)
на все вероятные поля поиска. Но практической пользы по сравнению с динамическим созданием запроса я думаю это не принесет. Не думаю (но не утверждаю этого), что у аксеса есть кэш запросов, а следовательно бороться за отсутствие парсинга не имеет смысла.


 
Jeer ©   (2007-03-12 09:30) [12]


> Многокритериальный поиск [D7, MS Access]


Почитайте об OLAP (MOLAP vs ROLAP) - возможно полегчает.
(гиперкубы, виртуальные звезды и пр. технологии WareHouse + DataMining)

Могу посоветовать взглянуть на технологию Дедуктора от basegroup
http://basegroup.ru/


 
databaser   (2007-03-12 09:51) [13]

Sergey13 ©   (12.03.07 08:28) [11]
Да, как раз об этом подумал, когда увидел ваши (и не только) посты в соседней теме. Попробую. По теме кэша запросов и борьбы за отсутствие парсинга - писал тестовое приложение, использовал, как обычно, AQTime для перфоманс профайла. Динамическая генерация (а следовательно и парсинг) - серьезно проигрывает параметризированным запросам.

Jeer ©   (12.03.07 09:30) [12]
Спасибо! Пошел курить маны. Basegroup помню, пару лет назад сталкивался. Сомнительно в плане применения в моей задаче.


 
databaser   (2007-03-12 09:54) [14]

MsGuns ©   (11.03.07 23:50) [10]
Ок. Попробую еще разок обмозговать все это.


 
Desdechado ©   (2007-03-12 11:35) [15]

> Рекурсия ничем толком не отличается от того append"a строк
> что вы предлагаете, окромя читабельности.
Еще как отличается. Подзапросы обычно в разы неэффективнее, чем соединения таблиц по ключам.

> (:par1 is null or Field1=:par1)
Не боишься картезиан схватить?

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


 
Sergey13 ©   (2007-03-12 11:57) [16]

> [15] Desdechado ©   (12.03.07 11:35)

> Не боишься картезиан схватить?
Я? С чего бы мне то бояться? 8-)


 
databaser   (2007-03-12 21:12) [17]

Desdechado ©   (12.03.07 11:35) [15]
Кто такой картезиан? Яндекс выдал море инфы, но она меня смущает )

(:par1 is null or Field1=:par1) - мне нравится этот вариант. Таким образом можно сделать параметризированный запрос без динамической генерации. Насколько будет быстрее, обязательно сообщу потом.


 
Val ©   (2007-03-12 22:31) [18]

>Кто такой картезиан?
декарово произведение, full join.


 
Val ©   (2007-03-12 22:32) [19]

декарТово



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
2-1178731051
Strate
2007-05-09 21:17
2007.05.27
Динамичное создение контролов


3-1173172482
VadimSpb
2007-03-06 12:14
2007.05.27
Скорость поиска


8-1158065921
NeyroSpace
2006-09-12 16:58
2007.05.27
Помогите разобраться с ф-цией ICCompress()


1-1175530495
DelphiLexx
2007-04-02 20:14
2007.05.27
Из TPageControl сделать аналог TNoteBook a


2-1178789460
ROOT
2007-05-10 13:31
2007.05.27
Массив классов TObject ????