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)

假设有人想搜索有空调、游泳池和洗衣房的房产。如果每一行只代表一个特征,如何查询 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,你可以省去对Feature的join,直接在fid上进行约束。您的前端会知道所选功能的数量是多少,因此确定上面“3”的值是微不足道的。

在性能方面,将其与上面的 tekBlues 结构进行比较;根据您的数据分布,其中之一可能是更快的查询。

于 2009-06-18T17:13:22.427 回答