![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 0 Dołączył: 16.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam, problem chyba typowy:
W bazie danych mam użytkowników, każdy z nich ma przypisanych co najwyżej pięciu innych użytkowników. Potrzebuję uzyskać id tych użytkowników poziomami, najlepiej w tablicy, gdzie każdy następny wiersz to tablica id użytkowników kolejnego poziomu. Przykład bazy danych (dla trzech powiązanych userów): Kod 1 2 3 4 5 6 7 8 9 0 11 12 13 itd... Domyślam się, by osiągnąć zamierzony efekt, muszę użyć rekurencji. Maksymalne zagłębienie takiego drzewa to max 10. poziomów. Rozwiązanie może nie być specjalnie złożonym algorytmem, ja naskrobałem coś takiego:
Niestety ten algorytm jest błędny a nie wiem jak go poprawić. Prosiłbym bardzo o pomoc w rozwiązaniu problemu. Pozdrawiam, Tomasz. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 116 Pomógł: 29 Dołączył: 13.12.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Chętnie pomogę, ale potrzebuję więcej informacji. Jak to wygląda w bazie danych? Co oznacza dokładnie liczbaPow? Jaką liczbę powiązań?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 0 Dołączył: 16.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję za odpowiedź.
W bazie danych każdy użytkownik ma oczywiście unikalne pole `id`, pole `powiazani` - w którym przechowuję dane w formie: 5,8,12,45,90 (tak, wiem, że to można optymalniej zrobić na oddzielnej tabeli ale nie w tym teraz sęk), pole `liczbaPow` - jest to liczba numerów id w polu `powiazani` (każdy użytkownik może mieć max. 5 id powiązanych ze swoim kontem). Jeżeli `liczbaPow` == 5 to algorytm szuka, wśród już powiązanych, id do którego może wykonać powiązanie (użytkownika z już powiązanych, którego pole `liczbaPow` < 5). Przy rejestracji nowego użytkownika, podawany jest id użytkownika już istniejącego w systemie (klient polecający). Fragment kodu rejestracji:
Funkcja odpowiedzialna za wyliczenie "wolnego" (`liczbaPow` < 5) klienta polecającego:
I teraz najważniejsza sprawa, bo powyższe działa dobrze, potrzebuję wyświetlić dane w formie tabeli, czy też drzewa - potrzebna mi do tego tablica wielowymiarowa, tworzona po podaniu numeru id klienta/użytkownika, zawierająca id wszystkich powiązanych klientów, powiązanych powiązanych, powiązanych powiązanych powiązanych itd. - 10 poziomów w głąb. Chodzi o drabinkę systemu MLM. Jej format powinien być następujący:
Z obliczeń wynika, że przy takim zagłębieniu i maksymalnym zapełnieniu tablicy, liczba jej elementów wyniesie (IMG:http://img543.imageshack.us/img543/8097/amsp211519g7hc9475ee7a3.gif) , ale przy zagłębieniu 7 liczba elementów to (IMG:http://img219.imageshack.us/img219/518/msp298419g7h9h4571f8ie7.gif) Z reguły w takich aplikacjach przyjmuje się, że liczba osób podpiętych pod każdego klienta jest nie większa od 3 - ja mam w specyfikacji, że ma być nie większa od 5, co drastycznie zwiększa ilość danych przy 10. stopniach zagłębienia. Jak teraz wykonać metodę, która będzie w stanie utworzyć tak dużą tablicę wielokrotnie zagnieżdżonych tablic? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 0 Dołączył: 16.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedź, chodzi o to, że poziom zagłębienia jest dynamiczny, tzn, że każdy klient może być na poziomie 0 względem klientów podpiętych pod niego, ale także na dowolnym poziomie 1-10 względem klientów nadrzędnych.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za odpowiedź, chodzi o to, że poziom zagłębienia jest dynamiczny, tzn, że każdy klient może być na poziomie 0 względem klientów podpiętych pod niego, ale także na dowolnym poziomie 1-10 względem klientów nadrzędnych. więc zagłębień jest więcej niż 10 poziomów ;] sorki - usunęła mi się poprzednia odpowiedź - więc jak w końcu masz te dane gdyż nie do końca chyba jednak rozumiem - odpytując bazę rekurencyjnie nieźle po niej pojedziesz ;] |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 0 Dołączył: 16.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Struktura tabeli:
Funkcja mająca stworzyć tablicę:
Tylko teraz jest problem, bo ta funkcja bardzo przeciąża serwer i skrypt się nie wykonuje. Czy można jakoś usprawnić powyższy kod dla założeń przedstawionych wcześniej? |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Ja bym zastosował metodę szukania wg. IP tzn. każdy użytkownik miał by zapisany adres wszystkich powiązań w górę. Bazując na twoi przykładzie:
Kod 1 2 3 4 5 6 7 8 9 0 11 12 13 itd... Dla użytkownika 8 IP = 1.3.8 dla 12 IP=1.4.12 itd.. Teraz wystarczy użyć w zapytaniu LIKE np. dla 3:
Możesz też dodać kolumnę określającą zagłębienie - znacznie ułatwi ci to wyszukiwanie / edycję drzewa |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 435 Pomógł: 40 Dołączył: 16.02.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wydaje mi się, że źle do tego podchodzisz.
Powinieneś w jednym zapytaniu pobrać z DB wiersze z wymaganymi użytkownikami. Po pobraniu tego fragmentu tabeli, przetwarzasz go odpowiednio w php. (czyli: w jednym zapytaniu do mysql pobierasz array() użytkowników, który następnie przetwarzasz już na poziomie php). A problem z powiązaniami wymaga użycia struktury grafu. (broń Boże drzewa! sam zobacz jak dużo miejsca zajmuje Twoja struktura danych, w porównaniu z tym co zaraz przeczytasz;) ) Graf implementujesz jako "lista sąsiedztwa". Taka reprezentacja grafu wygląda mniej więcej tak Wierzchołek | array() wierzchołków powiązanych 1: 2,3,4 2: 1,4, 3: 1, 4 4: 1,2,3 czyli mniej więcej tak: Kod array( array( Object: wierzcholek, array( Object: wierzcholek, //lista ... ), ), array( Object: wierzcholek, array( Object: wierzcholek, ... ), ), ) gdzie Wierzchołek to Twój obiekt "użytkownik". A teraz klucz do rozwiazania problemu: A jak juz bedziesz miał tak zapisany graf, to do przedstawienia 'poziomów' powiązań użytkowników wykorzystujesz algorytm DFS (przejście WGŁĄB ) - http://pl.wikipedia.org/wiki/Przeszukiwanie_w_głąb. Twój problem jest o tyle fajny, że wreszcie zmusza do programowania (a nie kolejnego klepania tego samego kodu ;P ) //jakbyś chciał to pisałem kiedyś kod DFSa ale w Javie, jednak jest to tak zbliżone do php, że myślę że dałbyś sobie rade z przepisaniem do php// Ten post edytował ano 8.07.2011, 19:31:01 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 23 Pomógł: 0 Dołączył: 16.02.2008 Ostrzeżenie: (0%) ![]() ![]() |
Koncepcja grafu jak najbardziej mi odpowiada, sam też w javie pisałem metody BSF i DSF więc jakoś to na php przełożę - dzięki za sugestie! Bardzo trafny pomysł (IMG:style_emoticons/default/smile.gif)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 17:52 |