|
|
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Дня доброго, многознающий ALL! Вот, заткнулся на вроде бы несложной (с виду) задачке, которую опишу на упрощённом примере: Допустим, есть книжная база BBase , куда привозят книги Book из разных издательств Izdat , по разным ценам, разных авторов, разных жанров. У базы есть клиенты Klient , которые хотят получать инфу о вновьприбывших книжках. Но у каждого клиента свои требования Wants . Один хочет знать, что пришли книги из конкретного издательства, другой - что есть книги конкретного жанра, третьему - в нужном ценовом диапазоне. Так вот сложность у меня в том, как корректно сделать справочник требований клиентов (Wants) так, чтобы: автоматически on insert BBase создавать некий док-т для каждого клиента можно было легко добавить нового клиента со сложным желанием (ну, например, из конкретного издательства, конкретных авторов) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Я ещё понимаю, если бы только 2-3 требования, пересекающиеся. И то у меня избыточность появляется... А ежели, допустим, ((Издат1+(Жанр1 или Жанр5)) или Автор1 или Автор7) и Цена<ХХХ В принципе, клиент может пожелать привезти книги из конкретного изд-ва сразу к себе, без заезда на базу. В таком случае, подавай ему, что в машине, да и данные машины, к тому же... В общем, голова уже опухла думать, как ЭТО реализовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 18:21 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Можно так, но не самый быстрый вариант Код: plaintext 1. 2. 3. 4. 5. Хранить null если все. Хранить список из айдишников через запятую, если несколько. Сложная хранимая процедура будет выбирать нужные книжки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 18:34 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
leptonМожно так, но не самый быстрый вариант ... Сложная хранимая процедура будет выбирать нужные книжки. ДыкЪ, не хотелось очень сложно делать... Да и я слишком упростил описание, как оказалось. То есть, я забыл, что у меня есть данные в связанной таблице, диапазон изкоторой и надо выбирать... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. То есть, мне нужны данные из диапазона значенийT2.val_col1 и T1.data1 А как это описать??? если в одном случае, мне нужно одна часть T1.data1, а в другом - другая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 20:05 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
kosqТак вот сложность у меня в том, как корректно сделать справочник требований клиентов (Wants) так, чтобы: Все довольно просто - храните желания клиентов в виде sql-выражения. По приходу очередной партии выполняйте Код: plaintext P.S. И лучше бы сразу учесть, что у книги бывает несколько авторов и жанров, цена - атрибут не книги, а партии, бывают сборники и все прочее, о чем я забыл, но легко нагуглить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 20:43 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
softwarerВсе довольно просто - храните желания клиентов в виде sql-выражения. По приходу очередной партии выполняйте Т.е. надо будет всё равно динамически sql-выражение формировать, я правильно понял? И хранить тогда <условие> в полном виде? Код: plaintext Код: plaintext softwarerP.S. И лучше бы сразу учесть, что у книги бывает несколько авторов и жанров, цена - атрибут не книги, а партии, бывают сборники и все прочее, о чем я забыл, но легко нагуглить. Книги - это в качестве примера, реально всё подругому, посложнее. Мне ведь принцип в данном случае важен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 22:35 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
kosqТ.е. надо будет всё равно динамически sql-выражение формировать, я правильно понял? Либо вбивать их в интерфейс прямо в виде sql :) Да, именно так. Не стоит этого бояться, формировать sql довольно легко, и особенно - на клиенте. Есть готовые компоненты, да и с нуля написать несложно. В принципе можно обойтись без динамического sql - уложив условия в конфигурационную таблицу а-ля qbe и отбирая записи хитрым join-ом. Но во-первых, это заведомо неэффективно (у динамического sql есть шанс), а во-вторых, если у Вас вызывает затруднения последний заданный Вами вопрос, написать этот хитрый join Вы просто не сможете. kosqИ хранить тогда <условие> в полном виде? Не очень понимаю, что такое "полный вид", но в целом - как Вам будет удобнее. kosqА, кстати, как правильно написать, если test_value может принять, допустим, 3 char значения: Код: plaintext Как вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 23:09 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Попробуй представить внешний вид формы поиска, полагаю, исходя из этого представления структуры данных будет проще представить. Кроме задания критерия поиска, как например в google или в секции where SQL запроса, есть старый, и ИМХО, достаточно простой для понимания, но мощный способ описания запроса - Query By Example (QBE). Самый простой вариант - автофильтр в Excel'е. Суть в том, что пользователь видит матрицу запроса. В ячейках матрицы пользователь задаёт искомое значение колонки таблицы с данными, которая соответствует колонке матрицы запроса или более сложные ограничения, например !=, <, >, between и т.п.. Все непустые поля в строке матрицы связаны оператором and. Условия составленные из разных строк матрицы связываются опертором or. Ну и дальше в таком духе. Чтобы пользователь не думал о структуре БД и соединениях отношений, её нужно представить в виде одного отношения в 1НФ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 23:14 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
softwarer kosqТ.е. надо будет всё равно динамически sql-выражение формировать, я правильно понял? Либо вбивать их в интерфейс прямо в виде sql :) Хм... Или я таки туп или одно из двух :) Код: plaintext 1. 2. 3. 4. 5. Теперь, если я делаю Код: plaintext 1. softwarer... формировать sql довольно легко... Ну, сформировать-то действительно не проблема ;) softwarerВ принципе можно обойтись без динамического sql - уложив условия в конфигурационную таблицу а-ля qbe и отбирая записи хитрым join-ом. Но во-первых, это заведомо неэффективно (у динамического sql есть шанс), а во-вторых, если у Вас вызывает затруднения последний заданный Вами вопрос, написать этот хитрый join Вы просто не сможете. Мде... "уложив условия в конфигурационную таблицу а-ля qbe" пока для меня тёмный лес :) softwarer Код: plaintext А кстати, какие ещё варианты? (кроме таблицы) Увы, мы академиев не кончали © не помню откуда , а под рукой книжки нет, вот и плыву в тумане, как студент на сессии :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 23:52 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
mcureenabПопробуй представить внешний вид формы поиска... Чтобы пользователь не думал... Пользователь тут не при чём: Автоматика, панымаишь :)) Хотя, если писать оболочку ввода требования клиента, то да - мысль того стОит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 23:56 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
kosqкак мне этот select book_id from books... дополнить сим условием? Разве можно обойтись как-нибудь без написания этого селекта динамически? Хм. Я не очень понимаю, неужели у Вас вызывает проблему конкатенация пары строк? Или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 23:59 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Я подозреваю, что мы говорим об одном и том же разными словами. Речь в итоге идёт о Код: plaintext 1. Или же существует другой путь, мне неизвестный? Может, я действительно не догоняю... :(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 00:23 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
kosqРечь в итоге идёт о Код: plaintext 1. Или же существует другой путь, мне неизвестный? Думаю, это вопрос к используемой Вами СУБД (и в соответствующий ей форум). Лично я - представления не имею, существует ли другой путь в некоей неизвестной мне СУБД :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 01:15 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Сорри, конечно. Речь про MS SQL 2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 01:19 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
kosqкак ЭТО реализовать...Как вариант, разбить один сложный запрос на цепочку более простых, которые и соединять с полученными на предыдущей итерации результатами. Грубый алгоритм: 1. Выбрать данные по условию, по которому будет получено минимальное количество записей. Например, во временную таблицу или табличную переменную. 2. Найти следующее, из оставшихся, условие, по которому будет получено минимальное количество записей. 3. В соответствии с условием соединения, добавляем в или удаляем из временной таблицы записи, получаемые по условию выбранному на предыдущем шаге. 4. Если остались еще условия, то переходим на шаг 2. 5. Возвращаем окончательный результат пользователю. Эффективность такого подхода зависит от многих причин. И вполне может сильно проиграть решению с построением и выполнением динамического запроса. Но может и несильно. Основная проблема, в определении условий с минимальным количеством выбираемых записей. Для этого возможно придется вести свою статистику и опираться на нее при построении последовательности. Впрочем, в данном случае, пожалуй, все-таки проще строить динамически, так как даже этот вариант, похоже, вызывает у Вас сложности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2007, 08:31 |
|
||
|
Как правильно составить справочник условий поиска?
|
|||
|---|---|---|---|
|
#18+
Спасибо всем откликнувшимся! В своём конкретном случае реализовываю вариант softwarera. Но не ожидал, что в функции нельзя запустить sp_executesql :(( (MS SQL 2000) Однако, это явно тема другого топика... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2007, 07:56 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=120&tid=1544527]: |
0ms |
get settings: |
6ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
138ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 500ms |

| 0 / 0 |
