문제
속성 기능 조회 테이블을 쿼리하는 방법을 찾으려고 노력하고 있습니다.
임대 부동산 정보 (주소, 임대료, 예금, 침실 등)와 다른 테이블 (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 건축과는 현명한 성능을 비교하십시오. 데이터 배포에 따라이 중 하나가 더 빠른 쿼리 일 수 있습니다.