Лучшая практика для запроса таблицы поиска - PullRequest
2 голосов
/ 18 июня 2009

Я пытаюсь выяснить способ запроса таблицы поиска свойств объекта.

У меня есть таблица свойств, которая содержит информацию о арендуемой недвижимости (адрес, аренда, залог, количество спален и т. Д.) Вместе с другой таблицей (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-запрос? Это возможно? Есть ли лучшее решение?

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

Ответы [ 3 ]

1 голос
/ 18 июня 2009

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

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, так как это происходит немного быстрее.

1 голос
/ 18 июня 2009

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

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

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 голосов
/ 18 июня 2009

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

  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')
         );

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

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

...