質問
プロパティフィーチャルックアップテーブルをクエリする方法を見つけようとしています。
レンタルプロパティ情報(住所、家賃、預金、寝室数など)を含むプロパティテーブルと、このプロパティの機能(プール、エアコン、ランドリー、サイトなど)。機能自体は、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)
誰かが、エアコン、敷地内のプールとランドリーのある物件を検索したいとします。各行が1つの機能のみを表す場合、同じプロパティの複数の機能について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を選択しているときにフロントエンドがキャプチャしている場合、Featureへの結合を省いてfidに直接制約をかけることができます。フロントエンドは、選択された機能の数を把握しているため、「3」の値を決定します。上記は簡単です。
パフォーマンスに関しては、上記のtekBlues構造と比較してください。データの分布に応じて、これらのいずれかがより高速なクエリになる可能性があります。