Сколько «сущностей» находится под этой иерархической структурой. Вложенный набор / Смежность (Сколько POI внутри Англии) - PullRequest
4 голосов
/ 20 июля 2011

Язык разработки и БД: PHP / MySQL

У меня есть таблица geo_places с примерно 8 миллионами географических местоположений.

Все эти места являются иерархическими, и я использую

  • parent_id (смежность) ,
  • lft / rgt (вложенный набор)
  • и родословная (перечисляемая) .

Теперь у меня есть таблица "точек интереса", называемая entities, которая назначенагеографическое местоположение, и я записываю для каждого объекта:

  • lft значение местоположения в geo_places
  • и фактическое ID географического местоположения.

Теперь мне нужен способ предоставить список каталогов с подсчетом EFIFICNETLY (но я все равно буду кешировать это) из всех мест, которые находятся ниже местоположения.

Например, если я беру Европу, я должен увидеть все места, у которых есть parent_id Европы, а также количество объектов под ним.Помня о том, что место не назначается напрямую Европе, но может быть назначено маленькой деревне в Италии (которая является ребенком Европы).

Вы знаете, что это тоже ребенок Европы, потому что:

  • значение lft маленькой деревни в Италии находится между значениями lft и rgtместоположение
  • или потому что родословная отображается на место.

Например, у Европы будет путь предков /1 и ID 5. (1 означает "Мир").И тогда маленькая деревня в Италии будет иметь /1/5/234/28924/124128

, где 1 = Мир 5 = Европа 234 = Италия 28924 = Бергамо и т. Д. И т. Д.

В любом случае, так я структурировалнабор данных, и я уже использовал смесь иерархических структур, чтобы сделать мои запросы намного более эффективными (для тех из вас, кто интересуется, почему я поддерживаю вложенный набор, смежность и перечисление ... это потому, что я получаю лучшеевсех структур таким образом).

Это пример того, что я пытаюсь сделать.Example

Я гибкий и могу изменить способ управления местоположениями, если это необходимо.Тем не менее, это также мультитенантное приложение, поэтому я хотел бы попытаться избежать сохранения значений в geo_places, если этого можно избежать.

Проще говоря: выберите местоположение ... затем покажите все местоположения, которые имеют точки интереса, назначенные либо этому местоположению, либо дочернему объекту этого местоположения.

Есть рекомендации?

1 Ответ

1 голос
/ 20 июля 2011

Это одно решение:

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 и 8 миллионами строк в geo_places. Индексируйте lft и rgt и woeid.

...