2009-06-18 1 views
2

Я пытаюсь выяснить способ запроса таблицы поиска свойств.Лучшая практика для запроса таблицы поиска

У меня есть таблица свойств, которая содержит информацию об аренде (адрес, аренду, депозит, количество спален и т. Д.) Вместе с другой таблицей (Property_Feature), которая представляет особенности этого имущества (бассейн, кондиционер, прачечная на сайт и т. д.). Сами функции определены в еще одной таблице с надписью «Feature».

Property 
    pid - primary key 
    other property details 

Feature 
    fid - primary key 
    name 
    value 

Property_Feature 
    id - primary key 
    pid - foreign key (Property) 
    fid - foreign key (Feature) 

Скажите, что кто-то хочет найти недвижимость с кондиционером и бассейном и прачечной на месте. Как вы запрашиваете таблицу Property_Feature для нескольких функций для одного и того же свойства, если каждая строка представляет только одну функцию? Как выглядит запрос SQL? Это возможно? Есть ли лучшее решение?

Спасибо за помощь и понимание.

+1

Фактически вы можете удалить столбец «id» в таблице Property_Feature и сделать pid и fid объединенным первичным ключом. –

ответ

1

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

Для запроса, я бы просто использовать существует, например:

select * from Property 
where 
exists (select * from Property_Feature where pid = property.pid and fid = 'key_air_conditioning') 
and 
exists (select * from Property_Feature where pid = property.pid and fid = 'key_pool') 

Где key_air_conditioning и key_pool, очевидно, ключи для этих функций.

Производительность будет нормально даже для больших баз данных.

+0

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

+0

Эрик, потому что он делает это в контексте программы, очевидно, и ключ, вероятно, рядом с рукой. Я предпочитаю EXISTS, потому что они чище и проще в сборке, особенно если количество условий является переменным. – tekBlues

+0

Объединяются, как правило, становятся немного грязными с переменным количеством условий ... Мне нужно подумать о том, как сделать это чище ... и как вызов, я хочу сделать это немного иначе, чем у вас есть :) – Eric

1

Вот запрос, который найдет все свойства с бассейном:

select 
    p.* 
from 
    property p 
    inner join property_feature pf on 
     p.pid = pf.pid 
    inner join feature f on 
     pf.fid = f.fid 
where 
    f.name = 'Pool' 

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

+0

Спасибо Эрик Я полностью упустил ключевое слово EXISTS. – 2009-06-18 19:18:48

0

Вы также можете сделать что-то вроде этого:

SELECT * 
    FROM Property p 
    WHERE 3 = 
     (SELECT COUNT(*) 
      FROM Property_Feature pf 
       , Feature f 
      WHERE pf.pid = p.pid 
       AND pf.fid = f.fid 
       AND f.name in ('air conditioning', 'pool', 'laundry on-site') 
     ); 

Очевидно, что если ваш передний конец захвата FIDS из элементов художественных, когда пользователь выбирает их, вы можете обойтись без объединения к функциям и ограничить прямо на fid. Ваш передний конец знал бы, что такое количество выбранных функций, поэтому определение значения для «3» выше тривиально.

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

+0

Я ценю обратную связь. Все эти решения я попробую. – 2009-06-18 19:18:10