4

開発言語・DB:PHP/MySQL

geo_places800 万の地理的な場所を含むテーブルがあります。

これらの場所はすべて階層的で、私は

  • parent_id (隣接) ,
  • lft/rgt (ネストされたセット)
  • および祖先(列挙)

entitiesこれで、地理的な場所に割り当てられた「関心のあるポイント」テーブルが呼び出され、各エンティティに対して次のように記録されます。

  • lftの位置の値geo_places
  • IDそして地理的な場所の実際。

ここで、場所の下にあるすべての場所のカウント EFIFICNETLY (ただし、とにかくこれをキャッシュします) を含むディレクトリ リストを提供する方法が必要です。

たとえば、ヨーロッパを取り上げると、parent_id がヨーロッパであるすべての場所と、その下にあるエンティティの量も表示されます。場所はヨーロッパに直接割り当てられるのではなく、イタリアの小さな村 (ヨーロッパの子) に割り当てられる可能性があることに注意してください。

次のいずれかの理由で、それがヨーロッパの子であることを知っています。

  • lftイタリアの小さな村の価値はと のlft価値rgtの間にある
  • または、祖先がその場所にマッピングされているためです。

たとえば、ヨーロッパの祖先パスは/15 で、ID は 5 です (1 は「世界」を表します)。そして、イタリアの小さな村には/1/5/234/28924/124128

どこで 1 = 世界 5 = ヨーロッパ 234 = イタリア 28924 = ベルガモ など...

とにかく、これは私がデータセットを構造化した方法であり、クエリをより効率的にするために、階層構造の混合物を既に使用しています (なぜネストされたセット、隣接関係、および列挙をサポートしているのか疑問に思っている方のために) .. これは、この方法ですべての構造を最大限に活用するためです)。

これは私がやろうとしていることの例です。 例

私は柔軟性があり、必要に応じて場所の管理方法を変更できます。ただし、これはマルチテナント アプリケーションでもあるため、回避できる場合は、geo_places に対するカウントの保存を回避したいと考えています。

簡単に言えば、場所を選択して、その場所またはその場所の子に割り当てられた関心のあるポイントを持つすべての場所を表示します。

推奨事項はありますか?

4

1 に答える 1

1

これは 1 つの解決策です。

select p.woeid, p.name, e.id, e.woeid, e.lft, count(e.lft) from
geo_places as p
 join  entities as e on e.lft >= p.lft and e.lft < p.rgt
where p.parent_woeid = 1
group by p.woeid

1子孫を見つけたい場所に代入します。

の 10万エンティティentitiesと の 800 万行でテスト済みgeo_placeslftおよびrgtに索引を付けwoeidます。

于 2011-07-20T17:23:51.863 に答える