3

不動産 Web サイトの場合、テキストと距離の両方を検索できる検索メカニズムを実装する必要があります。緯度と経度が別々の列に記録されている場合、 MySQLテーブル
で距離計算を行うのは簡単ですが、家には多くのプロパティがある傾向があります。true/false

これらのフィールドはすべて編集可能にする必要があるため、データベースに保存する必要があるため、| houseID | property |true (設定) であるすべてのプロパティを保存するような単純なテーブルを使用するつもりです。

これにより、何百もの列を持つ途方もなく広いテーブルを作成する必要がなくなりますが、このデータベースを検索することはあまり現実的ではありません。

すべてのプロパティtextのフィールド名を含む各家のメイン レコードに type の列を追加することを考えました。次に、テキストの説明とそのテキスト列trueの両方を検索しますが、それでも最善の方法ではないと感じています。human

どうすればこれをきれいに解決できますか?

前もって感謝します!

4

1 に答える 1

2

Entity Attribute ValueまたはEAVデータを保存するモデルをお勧めします。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(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
于 2012-07-23T23:12:40.287 に答える