[PHP][SQL] Kategorie - wydajne rozwiązanie

0

Zapoznałem się już z różnymi metodami implementacji drzewa kategorii, w tym:

  • prosta: ID + parent_id
  • nested tree (tree traversal)
  • wszystkie powiązania - metoda Depesza - więcej...
  • ścieżka typu IP (np. 001.007.015 bądź 1.7.15)

Zacząłem implementować metodę Depesza, jednak przenosiny kategorii wymagają skomplikowanych zapytań. Dlatego zastanawiam się, czy tego typu rozwiązania mają większy sens, gdyż potrzebna jest dodatkowa tabela i wzrasta zużycie przestrzeni dyskowej (choć niewiele).
Problem jest jeszcze przy wyciąganiu posortowanych kategorii. Autor używa zdefiniowanej funkcji w SQL-u, lecz myślę, że wystarczy wpisanie: "ORDER BY parent_id, depth, level" w zapytaniu.

Najważniejsza jest jednak szybkość. Jeśli już stosować podobną metodę, może lepiej zastosować nested tree bądź IP tree? Ta pierwsza prawdopodobnie jest mniej problemowa przy przenosinach, lecz pobrane dane wymagają dodatkowej obróbki w PHP (chyba, że dodamy do bazy dodatkowe pola, np. "depth", a wtedy też trzeba kombinować przy przenosinach).

Co do drugiej (IP) - z pobraniem nadkategorii nie ma problemu, bo ich ID znamy. :) Kategorie również łatwo posortujemy. Poziom w PHP odkryjemy po ilości kropek. Chcemy znaleźć jednak podkategorie. Wydajność może lekko spaść ze względu na użycie operatora LIKE (z % na końcu).

Wracając do prostego rozwiązania (ID + parentID):

  • pobierając nadkategorie, raczej musimy użyć osobnych zapytań (chyba, że się mylę)
  • przy wyświetlaniu wszystkich kategorii dane trzeba obrobić w PHP (w SQL-u sortujemy wg nazwy)
  • można wykonywać cache niektórych zapytań

Potrzebuję rozwiązania łatwego i co najważniejsze - [b]szybkiego[/b]. :) Co możecie mi doradzić? Może macie już doświadczenia z tymi metodami?

0

Ostatnio pisałem silnik kategorii dla Avallaha. Wyszło mi to chyba dobrze, najpierw wykonuje jedno zapytanie SQL, a potem tworzę tablicę, która odwzorowuje drzewo kategorii. Napisz do mnie na gg, to powiem Ci więcej

0

Cache i tak trzeba wykonywać, zaś LIKE bez % na początku powinno być szybkie. Metoda pozwala na szybkie i łatwe posortowanie kategorii, aby potem w PHP je pogrupować bez dodatkowych pętli bądź rekurencji. Jeśli stwierdzę, że nie ma dużych problemów przy implementacji, chyba pokuszę się o artykuł. :)

Nie 001.007 itp. tylko 1.7 itd.

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