开发语言和数据库:PHP/MySQL
我有一张geo_places
包含 800 万个地理位置的表格。
这些地方都是分层的,我用
- parent_id (邻接),
- lft/rgt (嵌套集)
- 和祖先(枚举)。
现在,我有一个名为“兴趣点”的表entities
,它被分配到一个地理位置,并且我针对每个实体记录:
lft
位置的价值geo_places
- 和实际
ID
的地理位置。
现在我需要一种方法来提供一个有效计数的目录列表(但无论如何我都会缓存这个),在一个位置下面的所有地方。
例如,如果我选择欧洲,那么我应该看到所有具有欧洲 parent_id 的地方,然后还有它下面的实体数量。请记住,一个地方不会直接分配给欧洲,但可能会分配给意大利的一个小村庄(这是欧洲的一个孩子)。
你知道它是欧洲的孩子,要么是因为:
lft
意大利小村庄的价值在地段的价值和价值lft
之间rgt
- 或者因为祖先映射到这个地方。
例如,欧洲的祖先路径为/1
5,ID 为 5。(1 表示“世界”)。然后意大利的小村庄就会有/1/5/234/28924/124128
其中 1 = 世界 5 = 欧洲 234 = 意大利 28924 = 贝加莫等...
无论如何,这就是我构建数据集的方式,并且我已经使用了分层结构的混合,以使我的查询更有效率(对于那些想知道为什么我支持嵌套集、邻接和枚举的人) ..这是因为我以这种方式获得了所有结构中最好的)。
这是我正在尝试做的一个例子。
我很灵活,可以根据需要更改管理位置的方式。但是,这也是一个多租户应用程序,所以如果可以避免的话,我想尽量避免保存对 geo_places 的计数。
所以简单地说:选择一个位置...然后显示所有具有分配给该位置的兴趣点的位置,或者该位置的子位置。
有什么建议吗?