3

对于房地产网站,我需要实现一种搜索机制,允许搜索文本和距离。当纬度和经度记录在单独的列中时,在MySQL
上进行距离计算很容易,但房子往往有很多属性。true/false

我需要将所有这些字段存储在数据库中,因为它们需要是可编辑的,因此我打算使用一个简单的表,例如| houseID | property |在其中存储所有为真(设置)的属性。

这将使我免于制作一个包含数百列的可笑的宽表,但是搜索这个数据库并不是很可行。

我曾考虑text在每个房屋的主记录中添加一列类型,其中包含所有true属性的字段名。然后我会搜索human文本描述和那个文本列,但我觉得这仍然不是最好的方法。

我怎样才能以干净的方式解决这个问题?

提前致谢!

4

1 回答 1

2

我会推荐存储数据的Entity Attribute ValueorEAV模型。http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model(这是 Wordpress 帖子和帖子元的工作方式)。

所以假设表格如下:

ENTITY_TABLE: (id,title,author,content,date_created,date_modified)
ATTRIBUTE_TABLE: (id, entity_id, akey, avalue)

使用这样的查询:

SELECT e.*, 
    MAX( IF(m.akey= 'has_ac', m.avalue, 0) ) as 'has_ac', 
    MAX( IF(m.akey= 'has_garage', m.avalue, 0) ) as 'has_garage', 
    MAX( IF(m.akey= 'has_fridge', m.avalue, 0) ) as 'has_fridge', 
    MAX( IF(m.akey= 'latitude', m.avalue, 0) ) as 'latitude', 
    MAX( IF(m.akey= 'longitude', m.avalue, 0) ) as 'longitude'
FROM ENTITY_TABLE e
JOIN ATTRIBUTE_TABLE m ON e.id = m.entity_id
WHERE has_ac=1

这将选择实体及其相关属性(has_ac、has_garage、has_fridge、纬度和经度),并要求所有选择的实体的 has_ac 等于 1(真)

现在是地理的东西:

SELECT e.*, 
    MAX( IF(m.akey= 'has_ac', m.avalue, 0) ) as 'has_ac', 
    MAX( IF(m.akey= 'has_garage', m.avalue, 0) ) as 'has_garage', 
    MAX( IF(m.akey= 'has_fridge', m.avalue, 0) ) as 'has_fridge', 
    MAX( IF(m.akey= 'latitude', m.avalue, 0) ) as 'latitude', 
    MAX( IF(m.akey= 'longitude', m.avalue, 0) ) as 'longitude',
    (
        3959 * 
        acos(
            cos( radians( MAX( IF(m.akey= 'latitude', m.avalue, 0) ) ) ) * 
            cos( radians( CUSTOMER_LAT ) ) * 
            cos( radians( CUSTOMER_LONG ) - radians( MAX( IF(m.akey= 'longitude', m.avalue, 0) ) ) ) + 
            sin( radians( MAX( IF(m.akey= 'latitude', m.avalue, 0) ) ) ) * 
            sin( radians( CUSTOMER_LAT ) ) 
        ) 
    ) AS distance
FROM ENTITY_TABLE e
JOIN ATTRIBUTE_TABLE m ON e.id = m.entity_id
WHERE has_ac=1
ORDER BY distance ASC
于 2012-07-23T23:12:40.287 回答