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クエリはどのようになりますか?これは可能ですか?より良い解決策はありますか?

ヘルプと洞察に感謝します。

4

3 に答える 3

1

データベース設計の観点から、あなたはそれを行う正しい方法です。正しく正規化されています。

クエリには、次のように、単に存在を使用します。

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が明らかにこれらの機能のキーである場合。

大規模なデータベースでもパフォーマンスは問題ありません。

于 2009-06-18T16:25:24.053 に答える
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少し高速になる傾向があるため、代わりに内部結合を使用します。

于 2009-06-18T16:26:48.483 に答える
0

次のようなこともできます。

  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構造と比較してください。データの分布に応じて、これらのいずれかがより高速なクエリになる可能性があります。

于 2009-06-18T17:13:22.427 に答える