2012-07-23 54 views
3

對於一個房地產網站,我需要實現一個搜索機制,允許搜索文本和距離。
MySQL的表做距離計算當緯度& LON被記錄在單獨的列是容易的,但房子往往有LOT true/false性能。距離+關鍵字搜索解決方案

我需要將所有這些字段存儲在數據庫中,因爲它們需要可編輯,所以我打算使用一個簡單的表,如| houseID | property |,其中存儲了所有屬性爲true(set)的表。

這將使我無法制作一個帶有數百列的可笑的寬表格,但是搜索這個數據庫將不太可行。

我想過爲每個房屋的主記錄添加一列text列,其中包含所有true屬性的字段名稱。然後,我會搜索human文本說明和文本列,但我覺得這仍然不是最好的方法。

我怎樣才能以一種乾淨的方式解決這個問題?

在此先感謝!

回答

2

我會推薦存儲數據的Entity Attribute ValueEAV模型。 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 
+0

非常感謝弗朗西斯。但是,這不允許用戶搜索「游泳池空調公寓」。我現在意識到我對搜索應該如何工作的描述不是很清楚。 重要的是,沒有一個房子可供搜索者使用的大型選項列表。它應該是自由文本(除了距離部分) – 2012-07-25 08:44:06

+0

我的2cents - 老實說,根據你的評論,我認爲你是在做這樣的錯誤。你應該有一個財產表和一個標籤表'游泳池''airco'和'condo'就是標籤。然後使用Harvest's Chosen之類的東西:http://harvesthq.github.com/chosen/(看看Multiple Select小工具) – 2012-07-26 15:49:32

+0

我會去看看。但我認爲你所說的話是有道理的。標籤可以自動生成,所以用戶實際上不會這樣做。 – 2012-07-28 15:24:11