Pomysł na zmniejszenie ilości zapytań/zużycia zasobów w drzewiastej strukturze danych

0

Witam,

mam bazę danych z użytkownikami. Każdy z nich ma swojego opiekuna, gdzie każdy może zostać opiekunem innej osoby. W ten sposób tworzy się struktura drzewiasta wszystkich użytkowników. Teraz rodzi się problem z wydajnością. Otóż osoby, która jest u samej góry tego drzewa, aby pobrać wszystkich użytkowników muszę wykonać blisko tysiąc zapytań do bazy, bo muszę pobrać na początku wszystkie osoby, które znajdują się bezpośrednio pod nim, następnie dla tych osób pobrać kolejne osoby będące bezpośrednio pod nimi itp. Na razie to działa, ale jest szalenie nieoptymalne. Potrzebuję jakiegoś lepszego rozwiązania.

Myślałem o tym, żeby pobrać wszystkich użytkowników bez żadnych kryteriów. Następnie przeszukać dla użytkownika tą tablicę w celu znalezienia struktury. Zapytanie będzie jedno, ale będzie wiele razy przeszukiwać tą tablicę, aby znaleźć całą strukturę dla wybranej osoby.

Wpadłem na pomysł, aby każdemu użytkownikowi dodać poziom w drzewku, czyli jak "głęboko" w tej strukturze się znajduje. Czyli (wg struktury w załączniku) użytkownik A będzie miał poziom 0, użytkownicy BCD będą mięli poziom 1, od E do M poziom 2 itp. No i dla użytkownika K z bazy pobiorę tylko te osoby, które mają poziom 3 i wyższy i w nich będę wyszukiwać jego strukturę. W ten sposób dla osób niżej w strukturze złożoność spadnie.

Zastanawiałem się czy macie jakieś inne sposoby, aby zoptymalizować wyszukiwanie tych osób. Cache odpada.

3

JAKA BAZA?????????????????????????????????
http://www.depesz.com/various/various-sqltrees.php

0

nijaka, korzystam z doctrine2 :)

dzięki za linka

1

to co łączysz się z powietrzem?

0

łączę się z mysql'em, ale równie dobrze może to być inna baza.

0

tak, ale niektóre bazy (np. oracle) mają specjalne funkcje do drzew http://diabl0.gazeta.ie/2009/03/drzewo-depesza-w-mysql-ciag-dalszy/

0

Jeśli cache nie wchodzi w grę (niby czemu?) i jeśli sam masz możliwość ustalenia struktury tabeli w bazie to proponuję tak:

  1. Tabelę w bazie tworzymy z polami ID_Node (unique), Node_Name, ID_Node_Parent (default 0)
  2. Zapisując element drzewa do tej tabeli wpisujemy jego nazwę (Node_Name) oraz powiązanie z ID rodzica (Node_Parent) (zero jeśli Node nie ma rodzica)
  3. Przy odtwarzaniu drzewa wczytujemy całą tabelę do jakiejś kolekcji i zaczynamy iterować po tej kolekcji szukając Node, które nie mają rodziców
  4. Jeśli mamy Node'a bez rodzica szukamy jego dzieci w utworzonej kolekcji w sposób rekurencyjny. Ewentualnie po odszukaniu Node- dziecka usuwając to dziecko z tej kolekcji, żeby przy następnej iteracji dla innego Node nie próbować go już odczytać (ale to może być mały problem przy wykorzystaniu rekurencji)

pzdr

1 użytkowników online, w tym zalogowanych: 0, gości: 1