2009-06-18 8 views
2

プロパティフィーチャルックアップテーブルを照会する方法を理解しようとしています。ルックアップテーブルを照会するベストプラクティス

私は、このプロパティの特徴を表す別のテーブル(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) 

は、誰かがエアコンを持つプロパティを検索したいとしましょう、とオンサイトのプールとランドリー。各行が1つのフィーチャのみを表す場合、Property_Featureテーブルに対して同じプロパティの複数のフィーチャをクエリするにはどうすればよいですか? SQLクエリはどのように見えますか?これは可能ですか?より良い解決策はありますか?

ご協力いただきありがとうございます。

+1

実際にProperty_Featureテーブルの "id"列を削除し、pidとfidを結合した主キーにすることができます。 –

答えて

1

データベース設計の点では、あなたは正しい方法です。正常に正規化されています。クエリのために

、私は単純に次のように、存在して使用します。key_air_conditioningとkey_poolは明らかにこれらの機能のための鍵である

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

大規模なデータベースでもパフォーマンスは正常です。ここで

+0

これはかなり不愉快ですね。あなたは彼に鍵を覚えることを期待していますか?結合を使用して、ID列である可能性のあるものを覚えようとするのではなく、機能に名前を付けることができます。 – 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キーワードを見落としました。 –

0

また、このような何かを行うことができます。ユーザーはそれらを選択しているときに、フロントエンドは、機能項目ののFIDをキャプチャしている場合

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に直接フロントエンドは選択した機能の数が何であったかを知るため、上記の「3」の値を決定するのは簡単です。

上記のtekBlues構成とパフォーマンスを比較してください。データの分布によっては、これらのいずれかがより高速なクエリになる可能性があります。

+0

フィードバックに感謝します。これらのソリューションのすべてを試してみます。 –

関連する問題