Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rekurencyjne zapytania kontra przetwarzanie tablic, Droga ku Wydajności
Dabroz
post
Post #1





Grupa: Zarejestrowani
Postów: 286
Pomógł: 0
Dołączył: 1.11.2003
Skąd: Poland, Płock

Ostrzeżenie: (0%)
-----


Pisząc CMS'a, właśnie zacząłem się zastanawiać nad kwestią rekurencyjnych funkcji wysyłających zapytania SQL. Jeżeli CMS ma strukturę drzewkową, to oczywiście nie można pobrać całości jednym "prostym" zapytaniem tak jak w konstrukcjach płaskich.

I tutaj zaczynam się zastanawiać nad możliwą optymalizacją.

Czy lepszym rozwiązaniem jest pozostawienie w rekurencyjnej fukncji (bądź też pętli) zapytania SQL, czy wywołania bardziej "ogólnego" zapytania, a potem za pomocą tejże funkcji przetwarzanie wyniku aby zbudować drzewko?

Za rekurencyjnym SQL'em przemawia łatwość implementacji... ale chyba nic poza tym. Nie podoba mi się po prostu zmienna ilość zapytań w zależności od poziomu zagnieżdzenia elementu.

A co Wy na ten temat sądzicie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Dabroz
post
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 0
Dołączył: 1.11.2003
Skąd: Poland, Płock

Ostrzeżenie: (0%)
-----


Zacznę w ten sposób: nie satysfakcjonuje mnie rozwiązanie narzucające maksymalny limit zagnieżdzeń kategorii (CMS ma być możliwie elastyczny).

Doszedłem do pomysłu aby schemat kategorii wyglądał w sposob następujący.

Piewsza, bazowa tabela to cats

Kod
int(11) ID, int(11) PARENT, varchar(32) NAME


Przypuśćmy takie drzewko:

Kod
                  ROOT
                 /    \
            kolory  kształty
           /      \
   niebieski      biały


Zawartość tabeli cats
Kod
ID |PAR|NAME
1  |0  |kolory
2  |0  |kształty
3  |1  |niebieski
4  |1  |biały


Druga tabelka to catrel. Przechowuje ona relacje między kategoriami na zasadzie wiele-do-wielu.

Kod
int(11) CAT_A, int(11) CAT_B, int(6) LEVEL


Gdzie CAT_A i CAT_B to ID'ki wiązanych kategorii a LEVEL to różnica poziomów między nimi - dodatnia oznacza dziecko a ujemna rodzica.

Zawartość catrel dla tego przykładu:

Kod
C_A|C_B|LEV
1  |3  |1
1  |4  |1
3  |1  |-1
4  |1  |-1


(root'a pomijamy, jako że jest ojcem wszystkiego)

Wtedy wyciągnięcie np wszystkich dzieci kategorii %ID% można zrobić za pomocą

  1. SELECT c.NAME, c.ID, r.LEVEL FROM (catrel r LEFT JOIN cats c ON r.CAT_B=c.ID) WHERE r.CAT_A= %ID% AND r.LEVEL > 0


Jak Wam się to podoba?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 26.12.2025 - 09:47