2012-07-23 2 views
3

부동산 웹 사이트의 경우 텍스트와 거리를 모두 검색 할 수있는 검색 메커니즘을 구현해야합니다. 경도 & LAT는 별도의 컬럼에 기록 될 때 MySQL의 테이블에
이렇게 거리 계산은 간단하지만 집은 LOT에게true/false의 특성을 가지고하는 경향이있다.거리 + 키워드 검색 솔루션

편집 할 필요가 있으므로 데이터베이스에 모든 필드를 저장해야합니다. 따라서 사실 (설정) 된 모든 속성을 저장하는 | houseID | property |과 같은 간단한 테이블을 사용하려고합니다.

이렇게하면 수백 개의 열이있는 엄청나게 넓은 테이블을 만들지 않아도되지만이 데이터베이스를 검색하는 것은 그리 적절하지 않습니다.

모든 true 속성의 필드 이름을 포함하는 각 집의 기본 레코드에 text 유형의 열을 추가하는 방법에 대해 생각해 보았습니다. 그런 다음 human 텍스트 설명과 해당 텍스트 열을 모두 검색하지만 여전히 최선의 방법이라고 생각하지 않습니다.

어떻게하면 문제를 해결할 수 있습니까?

미리 감사드립니다.

답변

2

Entity Attribute Value 또는 EAV 데이터 저장 모델을 권장합니다. http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model (이것은 Wordpress Post 및 Post Meta 작업 방법입니다).

그래서 가정 테이블 같은 :

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

이 같은 쿼리를 사용하여 개체 및 관련 특성 (has_ac, has_garage, has_fridge, 위도, 경도)를 선택합니다

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 

및 선택한 모든 엔티티가 1과 같음 (true)

이제 지리 정보 용 :

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

감사합니다. Francis. 그러나 이렇게하면 사용자가 "수영장 airco 콘도"를 검색 할 수 없습니다. 나는 이제 검색이 어떻게 작동해야하는지에 대한 나의 설명이 아주 분명하지 않다는 것을 깨닫는다. 집이 검색 자에게 제공 할 수있는 큰 옵션 목록이 없다는 점이 중요합니다. 그것은 자유 텍스트 여야합니다 (거리 부분 제외) –

+0

내 2 센트 - 솔직히, 귀하의 의견을 바탕으로, 나는 당신이 잘못 생각하고 있다고 생각합니다. 속성 테이블과 태그 테이블'swimming pool'' airco'와'condo' 태그가 있어야합니다. Harvest 's Chosen과 같은 것을 사용하십시오 : http://harvesthq.github.com/chosen/ (Multiple Select 위젯을보십시오) –

+0

제가 가볼 게요. 하지만 네 말이 말하는 말이 맞는 것 같아. 태그는 자동으로 생성 될 수 있으므로 사용자가 실제로 태그를 지정하지 않아도됩니다. –