문제

속성 기능 조회 테이블을 쿼리하는 방법을 찾으려고 노력하고 있습니다.

임대 부동산 정보 (주소, 임대료, 예금, 침실 등)와 다른 테이블 (Property_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 쿼리는 어떻게 생겼습니까? 이게 가능해? 더 나은 솔루션이 있습니까?

도움과 통찰에 감사드립니다.

도움이 되었습니까?

해결책

데이터베이스 디자인 측면에서 귀하는이를 수행하는 올바른 방법입니다. 올바르게 정규화되었습니다.

쿼리의 경우 다음과 같이 단순히 사용합니다.

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은 분명히 해당 기능의 키입니다.

대형 데이터베이스의 경우에도 성능은 괜찮습니다.

다른 팁

다음은 풀과 함께 모든 속성을 찾을 수있는 쿼리입니다.

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 조금 더 빠르기 때문에.

다음과 같은 일을 할 수도 있습니다.

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

분명히, 프론트 엔드가 사용자가 선택할 때 피처 항목의 FID를 캡처하는 경우, FID에서 직접 제한하여 조인을 사용하여 제한을 해제 할 수 있습니다. 프론트 엔드는 선택한 기능의 수가 무엇인지 알 수 있으므로 위의 "3"값을 결정하는 것은 사소한 일입니다.

위의 Tekblues 건축과는 현명한 성능을 비교하십시오. 데이터 배포에 따라이 중 하나가 더 빠른 쿼리 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top