алгоритмы структуры данных для поиска в базе данных - PullRequest
0 голосов
/ 01 апреля 2010

Я привык к традиционному способу поиска в базе данных со следующим

  1. с использованием подстановочных знаков для поиска терминов
  2. с использованием условия where для конкретных данных, таких как адреса и имена

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

Существуют ли алгоритмы, которые вы используете для сложного поиска в базе данных? Я пытался искать некоторые, но мне было трудно это сделать. Я наткнулся на бинарный поиск, но не могу найти для него применение: (

РЕДАКТИРОВАТЬ : Вот псевдокод поиска, над которым я работал. Он использует ползунки диапазона jquery для максимального и минимального поиска

query = 'select * from table'

if set minprice and not set maxprice
 if minprice = 'nomin'
  query += ' where price < maxprice'
 else
  query += ' where price < maxprice and price < minprice'
if not set minprice and set maxprice
 if maxprice = 'nomax'
  query += ' where price > minprice'
 else
  query += ' where price > minprice and price < maxprice'

if set maxprice and set minprice
 if maxprice = 'nomax'
  query += ' where price > minprice'
 else
  query += ' where price > minprice and price < maxprice'

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

РЕДАКТИРОВАТЬ под элегантным я имею в виду способы переписывания кода, чтобы добиться более быстрых запросов при меньшем количестве строк кода

Ответы [ 5 ]

0 голосов
/ 01 апреля 2010

Основная проблема с вашим кодом состоит в том, что он излишне обдумывает каждую возможную комбинацию set(minprice) и set(maxprice), в то время как они могут обрабатываться независимо:

query = 'select * from table'
conditions = [] #array of strings representing conditions 
if set(minprice):
    conditions.append("price < minprice")
if set(maxprice):
    conditions.append("price > maxprice")
if len(conditions)>0:
    query += ' WHERE ' + " and ".join(conditions)

В общем, выгодно разделятьгенерация условий (if set(...) строк выше) от построения фактического запроса.Таким образом, вам не нужно отдельное if для создания (или пропуска) "AND" или "WHERE" перед каждым сгенерированным условием, но вместо этого вы можете просто обработать его в одном месте (последние две строки выше), добавив инфиксыпо необходимости.

0 голосов
/ 01 апреля 2010

попытайтесь сосредоточиться на реорганизации процесса построения запросов.

query = select + 'where' + filter1 + filter2

select = 'select * from table'

filter1 = '';
if set minprice 
   if minprice = 'nomin'
      filter1 = price > minprice'
   else
      filter1 = 'price < minprice'

и т. Д. ... пока не будет полный запрос:

query = select;

if any filter on
   query += ' where '
   first = true

   if set filter 1
      if not first
         query += ' and '
      query += filter1

и так далее ...

вы можете поместить ваши фильтры в массив. он более «масштабируемый» для вашего кода.

0 голосов
/ 01 апреля 2010

Хорошо, я все еще не очень понимаю, что вы хотите, но я сделаю попытку ...

Если вы пытаетесь ускорить запрос, вам не нужно беспокоиться об «улучшенных алгоритмах». Просто убедитесь, что у всех столбцов, по которым вы ведете поиск (price в вашем примере), есть индекс, и база данных позаботится об эффективном поиске. Это очень хорошо, обещаю.

Что касается уменьшения количества кода, опять же, я не могу говорить для каждого случая, но ваш приведенный выше псевдокод раздут, потому что вы обрабатываете один и тот же случай несколько раз. Мой код для чего-то подобного был бы больше похож на этот (псевдокод, без определенного языка):

if (set(minprice) and minprice != 'nomin')
    conditions[] = 'price > minprice'

if (set(maxprice) and maxprice != 'nomax')
    conditions[] = 'price < maxprice'

query = 'select * from table'
if (notempty(conditions))
    query += ' where '+conditions.join(' and ')
0 голосов
/ 01 апреля 2010

При взаимодействии с базой данных вам гораздо сложнее сложный и уродливый запрос, чем «элегантный» запрос, дублирующий функциональность поиска в базе данных внутри вашего приложения. С каждым вызовом в базу данных связана стоимость. Если вы пишете код для поиска в базе данных в вашем приложении, это практически гарантированно будет дороже.

Если вы на самом деле не пишете базу данных (высокий порядок), пусть база данных выполнит поиск.

0 голосов
/ 01 апреля 2010

Запоминающая скорость запроса - это не только сам запрос. Также многое зависит от того, как структурирована БД. Это стандартный реляционный макет, или звезда, или? Индексируются ли ваши ключи и есть ли у вас вторичные индексы? Ожидаете ли вы вернуть много данных или просто пару строк? Вы ищете столбцы, в которых БД должен выполнять текстовый поиск, или числовые значения. И, конечно же, как физически выстроен db? таблицы индексов и тяжелых обращений на отдельных дисках? и так далее. Как и предыдущие люди, возможно, конкретный пример будет более полезным при попытке решить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...