4

开发语言和数据库:PHP/MySQL

我有一张geo_places包含 800 万个地理位置的表格。

这些地方都是分层的,我用

  • parent_id (邻接)
  • lft/rgt (嵌套集)
  • 和祖先(枚举)

现在,我有一个名为“兴趣点”的表entities,它被分配到一个地理位置,并且我针对每个实体记录:

  • lft位置的价值geo_places
  • 和实际ID的地理位置。

现在我需要一种方法来提供一个有效计数的目录列表(但无论如何我都会缓存这个),在一个位置下面的所有地方。

例如,如果我选择欧洲,那么我应该看到所有具有欧洲 parent_id 的地方,然后还有它下面的实体数量。请记住,一个地方不会直接分配给欧洲,但可能会分配给意大利的一个小村庄(这是欧洲的一个孩子)。

你知道它是欧洲的孩子,要么是因为:

  • lft意大利小村庄的价值在地段的价值和价值lft之间rgt
  • 或者因为祖先映射到这个地方。

例如,欧洲的祖先路径为/15,ID 为 5。(1 表示“世界”)。然后意大利的小村庄就会有/1/5/234/28924/124128

其中 1 = 世界 5 = 欧洲 234 = 意大利 28924 = 贝加莫等...

无论如何,这就是我构建数据集的方式,并且我已经使用了分层结构的混合,以使我的查询更有效率(对于那些想知道为什么我支持嵌套集、邻接和枚举的人) ..这是因为我以这种方式获得了所有结构中最好的)。

这是我正在尝试做的一个例子。 例子

我很灵活,可以根据需要更改管理位置的方式。但是,这也是一个多租户应用程序,所以如果可以避免的话,我想尽量避免保存对 geo_places 的计数。

所以简单地说:选择一个位置...然后显示所有具有分配给该位置的兴趣点的位置,或者该位置的子位置。

有什么建议吗?

4

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替换要查找其后代的地方。

用 100k 个实体entities和 800 万行在geo_places. 索引lftrgtwoeid

于 2011-07-20T17:23:51.863 回答