![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 1 Dołączył: 22.08.2006 Skąd: universe Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Otoz mam tabelke sql: id | parent_id | name Kategoria ktora posiada parent_id = 0 to kategoria glowna. Napisalem dwie funkcje:
wywołanie:
Gdy testowalem to na kilkunastu kategoriach wszystko bylo ok ale gdy docelowo uzylem okolo 10 tys. kategorii pojawil sie problem... Testujac to na localhost po chwili wszystko zaczelo sie wieszac. Prosze Was o pomoc. -------------------- Potrzebujesz dodać darmowe ogłoszenia ?, w takim razie musisz odwiedzić to miejsce !
Presell - tutaj dodasz swoj artykul za darmo ! Presell Page dla wszystkich bez limitów i utrudnień Masz firme ? Ta baza firm jest dla Ciebie i Twoich znajomych są też śmieszne filmiki |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 418 Pomógł: 8 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
No nic dziwnego, że się zapchało - 10000 to ździebko dużo...
![]() Inna sprawa, że popatrz sobie ile to zapytań będzie przy takiej ilości kategorii. Najlepiej wszystkie kategorie pobierz od razu, jednym zapytaniem, a potem na tym co otrzymasz manipuluj po swojemu. Posortuj od razu (w zapytaniu) po parent_id - tak chyba będzie łatwiej to potem ogarnąć... Ten post edytował qqrq 5.09.2007, 12:32:46 -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Problem leży zapewne w tym, że dla każdej kategorii sprawdzasz czy posiada podkategorie za pomocą zapytania SQL wykonywanego w pętli. Nie dziw się, że przy tak dużej liczbie pętli skrypt pada. Możesz to zrobić bez problemu na 1 zapytaniu!
Za pomocą tego zapytania budujesz sobie drzewko postaci:
czyli index tablicy $cat to kategoria nadrzędna. Każdy element $cat jest również tablicą zawierającą podkategorie. Wystarczy teraz zwykłą pętlą przelatywać tablicę $cat w poszukiwaniu kategorii i podkategorii. Równocześnie, żeby zaoszczędzić czas, możesz po zbudowaniu odpowedniej gałęzi usuwać z tablicy użyte dane aby przy następnym przebiegu pętli nie sprawdzać tych, które zostały wcześniej użyte. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Możesz też zrobić coś innego... Zdaje się że gdzieś jest nawet artykuł o tym na wortalu. Id może mieć postać np. liczby 10 cyfrowej gdzie pierwsze 2 cyfry to id kategorii glownej, dwie kolejne to id podkategorii itd.
np. 1000000000 - kategoria glowna 1001000000 - podkakategoria 1002000000 - inna podkategoria 1002010000 - podakategoria poprzedniej podkategorii, 2000000000 - inna kategoria główna itd W czymś takim sortowanie i wybieranie zagnieżdżonych pozycji jest znacznie łatwiejsze. Z drugiej strony struktura jest trochę mniej skalowalna, ale jeśli masz konkretny przypadek, to zapewne sam określisz wady i zalety takiego rozwiązania. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
phpion.com: Pobranie wszystkich elementów z tej tablicy (10 tys. rekordów) skutecznie zawali pamięć... W ten sposób wszystko można zrobić na jednym zapytaniu, tylko trzeba się potem namęczyć, żeby zapisać wszystkie warunki w postaci kodu (niekoniecznie efektywnego).
Można zastosować nested sets, ale wstawianie i przenoszenie elementów wymaga aktualizacji sporej części rekordów (mimo tego, że nie są to skomplikowane operacje, zwykle 2 zapytania starczają). Pobranie wszystkich elementów podrzędnych jest bardzo proste i wymaga tylko jednego zapytania... Ale tak jak mówiłem, utrzymanie nested sets na takiej dużej bazie nie musi być przyjemne (nie testowałem osobiście...). Na Twoim miejscu przestudiowałbym dokładniej temat drzewek (sam się nad tym męczę)... -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
phpion.com: Pobranie wszystkich elementów z tej tablicy (10 tys. rekordów) skutecznie zawali pamięć... Racja, ale kto normalny robi tyle kategorii ![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 1 Dołączył: 22.08.2006 Skąd: universe Ostrzeżenie: (0%) ![]() ![]() |
Nie moge używać metody zagnieżdżenia kategorii , musze pozostac przy pierwotnej (rodzic, dziecko)
-------------------- Potrzebujesz dodać darmowe ogłoszenia ?, w takim razie musisz odwiedzić to miejsce !
Presell - tutaj dodasz swoj artykul za darmo ! Presell Page dla wszystkich bez limitów i utrudnień Masz firme ? Ta baza firm jest dla Ciebie i Twoich znajomych są też śmieszne filmiki |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Przy pobieraniu n poziomów możesz pobrać wszystkie dane za pomocą n zapytań, jeżeli dobrze myślę... Pomyśl coś w tym kierunku (pisane z palca, nie testowane, nie gwarantuję poprawnego działania
![]()
Ten post edytował Ludvik 5.09.2007, 18:10:32 -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 167 Pomógł: 1 Dołączył: 22.08.2006 Skąd: universe Ostrzeżenie: (0%) ![]() ![]() |
Dzieki.
Tylko, ze przy tej metodzie jest utracony wazny element, ktora kategoria dziecko jest pod ktora kategoria rodzicem. -------------------- Potrzebujesz dodać darmowe ogłoszenia ?, w takim razie musisz odwiedzić to miejsce !
Presell - tutaj dodasz swoj artykul za darmo ! Presell Page dla wszystkich bez limitów i utrudnień Masz firme ? Ta baza firm jest dla Ciebie i Twoich znajomych są też śmieszne filmiki |
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Ale przecież masz pole parent_id w bazie, więc czemu go nie użyć do odwzorowania związków? Dopisanie tego nie będzie raczej problemem...
-------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 14.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
kiedys niepotrzebnie rozwiazlem ten problem
-------------------- Black Tarantula
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 01:53 |