Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Zapytanie w drzewie zalezności
Forum PHP.pl > Forum > Bazy danych > MySQL
ShadowOfMonster
Powiedzmy że mamy oto taką przykładową strukturę zależności użytkowników:
(strzałki interpretują zależność master/slave User2 ma mastera jako User1 ale ma też slave'a User3 ale np. User8 ma jako master'ów User4, User3 etc. (kolejność nadrzędności jest ważna) sama długość gałęzi drzewa jest teoretycznie nieograniczona)
Dany User może mieć mnóstwo slav'ów ale tylko jednego master'a.

User1 -> User2 -> User3 -> User4 ->User5
User1 -> User6 -> User7
User6 -> User11
User4-> User8->User9->User10
(etc.)

Oczywiście takich drzewek mamy sporo
W bazie jest to prosto reprezentowane poprzez kolumny id, name, master

Teraz problem składa sie na funkcję która powie mi np. czy User999 ma jako master'a User2 lub czy User10 ma jako mastera User4

Oczywiście logicznie jest to do zrobienia. Wykonywać zapytania w SQL tak długo aż dojedziemy do kolesia który nie ma mastera i stwierdzimy że jest false lub go w końcu znajdziemy i będzie true no ale tak to trochę można bazę zajechać.
Można tez po prostu wczytać wszystkie rekordy do zmiennej tablicowej (lub przy pewnych założeniach jakąś większą część) i w php bawić sie w wyszukiwanie (odtwarzanie drzewa) ale przy bardzo dużej bazie (tablica rzędu 50MB) gdzie chcemy znaleźć kilka odpowiedzi da nam długi czas wykonywania skryptu.

Więc moje pytanie sprowadza się do tego czy takie wyszukiwanie mastera można załatwić odpowiednim zapytaniem w SQL'u poprze powiązanie kolumny master?
wookieb
Według mnie przydałoby się dodanie jeszcze jednego pola np :* path_id a do tego path_order. Path id trzyma numer ścieżki a path_order pozwoli ci na szybkie znalezienie który user na jakiej jest pozycji. Można się wtedy pozbyć kolumny master.
Path_id: 1,1,1,1,1
Path_order: 1,2,3,4,5
Users: u1, u8, u6, u10, u2
ShadowOfMonster
Cytat(wookieb @ 8.07.2009, 06:28:46 ) *
Według mnie przydałoby się dodanie jeszcze jednego pola np :* path_id a do tego path_order. Path id trzyma numer ścieżki a path_order pozwoli ci na szybkie znalezienie który user na jakiej jest pozycji. Można się wtedy pozbyć kolumny master.
Path_id: 1,1,1,1,1
Path_order: 1,2,3,4,5
Users: u1, u8, u6, u10, u2



Coś w rodzaju współrzędnych gałęzi - tez to znam. Pytam czy po prostu nie ma takiego zapytania w SQL które dzięki powiązaniu rekordu master po prostu samo nie szłoby to końca gałęzi użytkowników gdzie master byłby null lub zero a odpowiedz prosta true lub false w przypadku odnalezienia lub nie. Miało by to pewne zalety optymalizacji bazy danych a jedynie zwiększenie potrzeby czasu na odnalezienie naszego mastera lub nie. Biorąc pod uwagę że mamy bazę danych na poziomie 500MB i w tabeli redukcja dwóch kolumn (path_id i Path_order do jednej master). Proces sql po prostu mógłby skakać z wiersza do wiersza dzięki powiązaniu kolumny master z id. Miałoby by to walory optymalizacyjne wielkości bazy (pamięci też) kosztem czasu procesu który byłby szybszy niż czas procesu w przypadku zabawy całą tabelą w php ale na pewno dłuższy od twojego rozwiązania. Nie mam czasu na bawienie się w testowanie takich rzeczy a nie przychodzi mi do głowy aby takie zapytanie istniało dlatego się pytam.

Dla pojedynczej strony nie ma to wielkiego znaczenia. Ale jeśli mówimy o bazach danych gdzie tabele sięgają milionów wierszy każdy element ma pewne znaczenie w działaniu i optymalizacji. Skakanie z wiersza do wiersza wydaje się nie optymalizacyjne jeśli np. mamy do czynienia z gałęzią sięgającą tysiąc w głąb. Ale w moim przypadku mówimy o dwóch rekordach a wczytany zostanie cały pojedyńczy wiersz danego użytkownika (lub master'a) jeśli odpowiedź będzie true.

Tak mi wpadł problem do głowy. winksmiley.jpg

Pozdrawiam.
KrZych0o
przepraszam że odkopuje temat ale mam podobny problem.. Nie ma jakiegoś szybkiego algorytmu albo zapytania gdzie skrypt odpowiednio zagłębiał by się w danym drzewie ?
emkej
Napisz coś więcej, jakim drzewie? Jak ma działać?

Bo na Twoje pytanie teraz istnieje chyba jedna odpowiedz: chyba jest smile.gif
irmidjusz
Są różne szybkie algorytmy (zapytania SQL) służące do przeszukiwania drzewa, ale wszystko zależy od sposobu przedstawienia tych danych hierarchicznych w tabeli (tabelach).

Poczytaj o:
- adjacency list,
- path enumeration,
- nested set,
- closure table
KrZych0o
Mam listę kategorii:

Kategoria 1
->Podkategoria
->Podkategoria 2

itd

Następnie dany użytkownik wybiera sobie Podkategoria 2 do swojego profilu. W wyszukiwarce po wybraniu Kategoria 1 go nie znajduje a chcę żeby mi znajdowało wszystkich użytkowników którzy wybrali nawet ostatnią gałąź drzewa.

Pobranie wszystkich kategorii i przeładowanie tego do zapytania mija się z celem. Najlepsze byłoby bezpośrednie zapytanie.
Może ktoś już miał taki problem ?
alegorn
oczywiscie ze mial juz ktos taki problem wink.gif

masz trzy || cztery podstawowe wersje rozwiązania problemu struktur drzewiastych + mutacje.
nawet tu na tym forum opisane bylo to kilkukrotnie.

wskazanie rodzica, enumeracja ścieżki,zbiory zagnieżdżone, tabela domknięcia
(często są inaczej nazywane, ale wiadomo o co chodzi)
każda z tych metod ma ®opracowany algorytm dla podstawowych operacji.
nie musisz wymyślać na nowo koła. wystarczy poczytać/poszukać o tych już wymyślonych, i wybrać odpowiednie dla siebie wink.gif
j.
KrZych0o
tylko to są algorytmy do przetwarzania owych informacji.. ja chciałbym bezpośrednio to wywołać w sql.. bo zaczytanie 40 tys rekordów i przetworzenie tego odpowiednio chwilę trwa
irmidjusz
To są sposoby konstruowania tabel i wykonywania zapytań SQL. Nie przetwarzasz tych informacji w PHP, tylko wykonujesz odpowiednie zapytania SQL na odpowiednio zaprojektowanych tabelach i nie musisz wczytywać wszystkich wierszy - te zapytania zwracają Ci tylko te wiersze, które potrzebujesz. Poczytaj o tym.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.