Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problematyka powiązań
spenalzo
post 30.11.2003, 18:18:26
Post #1





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


Mam taki schemat:


:arrow: http://spenalzo.republika.pl/schemat.gif
(wybaczcie za koślawy rysunek)

Jest to schemat powiązań pomiędzy użytkownikami:
R - root (ja)
R.1-R.6 - moi znajomi
A-H - znajomi R.1-R.6 (tutaj dla uproszczenia schematu po jednym)
A.1-H.6 - znajomi A-H

Oczywiście mogą potem być dalej różne inne powiązania (np. A.1.1.1-A.1.2.6 itd itp) - ale ja widze tylko od poziomu R do ostatniego na schemacie czyli A.1-H.6
Powiazania pomiędzy użytkownikami są zależne w taki sposób, że jeżeli dodam nowego znajomego to wszyscy (do 3 poziomu zaglębienia) widzą jego, ci na 2 poziomie widzą jego i jego znajomych na I poziomie itd. Natomiast ja widzę jego znajomych do 3 poziomu, czyli schemat się powtarza. Z kolei użytkownicy na 6 poziomie widzą moich znajomych na 3 poziomie.

W jaki sposób rozpracować strukture tych powiazań i w jakim stopniu przerzucić "ciężar" tych powiązań na php a w jakim stopniu na MySQLa?


--------------------

Go to the top of the page
+Quote Post
bumelang
post 30.11.2003, 19:35:20
Post #2





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 30.11.2003

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


Z tego, co wiem, to to się modeluje na dwa sposoby: pierszy, oczywisty - zarzucanie bazy milionem zapytań dotyczących kolejnych rodziców i dzieci danego węzła, co ma na sens gdy często się dodaje a rzadko wybiera dane i chyba średnio ma sens przy Twoim schemacie.

Drugi jest znacznie bardziej wysublimowany i nadaje się do informacji często wybieranej, ale rzadko dodawanej z uwagi na duży koszt dodawania czy usuwania rekordu. Wygląda to tak, że w SQLu przechowuje nadmiarową informację dotyczącą struktury drzewa (tj. poza informacją o ojcu), którą trzeba odbudować za każdym razem gdy ta się zmienia.

Korzyść z tego za to taka, że wszystkie operacje wybierania całej gałęzi etc. wykonuje się jednym zapytaniem. Jest to dość skomplikowane i średnio pamiętam jak to się dokłanie robi. Nie wiem też na ile na MySQLu da się to sensownie zaimplementować, ale że ciągle mnie ta baza zaskakuje, to być może się da.

Poszukaj sobie w googlach po prostu "SQL trees" czy coś w tym stylu - to powinno Ci to przybliżyć problem. Pozdrowienia.
Go to the top of the page
+Quote Post
cagrET
post 30.11.2003, 20:17:09
Post #3





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Opole

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


http://searchdatabase.techtarget.com/tip/1...i537290,00.html

http://searchdatabase.techtarget.com/tip/1...i801943,00.html


--------------------
code.gosu.pl
Go to the top of the page
+Quote Post
spenalzo
post 1.12.2003, 00:37:42
Post #4





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


Hmmm poszukałem sporo różnym przykładów takich drzewek, jak np. to:
Kod
            Albert (1,12)

            /        

           /          

    Bert (2,3)     Chuck (4,11)

                   /    |    

                  /     |      

                 /      |      

                /       |        

        Donna (5,6)  Eddie (7,8)  Fred (9,10)


Kod
emp         lft  rgt

======================

'Albert'      1   12

'Bert'        2    3

'Chuck'       4   11

'Donna'       5    6

'Eddie'       7    8

'Fred'        9   10


ale nie rozumiem w jaki sposób przypisuje się te numery do lft i rgt, co one oznaczają i skąd się one biorą? rolleyes.gif


--------------------

Go to the top of the page
+Quote Post
Bakus
post 1.12.2003, 04:14:24
Post #5


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Nie wiem, czy to będziedobre rozwiązanie, ale czy nie możasz zapisywać w tabeli tylko "ojców" questionmark.gif

Przykład tabelki:

ID Nick Rodzic
1 spenalzo 0 - nie posiadasz "rodzica" - jesteś root winksmiley.jpg
...
5 bakus 1 - poleca mnie nr 1 - ty
...
315 kolega_bakusa 5 - dorzucam swojego kolege

Rozumiesz o czym rozmawiam questionmark.gif
Nie jestem pewien, czy takie coś się sprawdzi w zadanui, jakie wykonujesz, ale obsług takiego czegoś jest prosta... szukasz w bazie ludzi R.1-R.8 -> wyciągasz te rekordy w których Rodzic to 1 - czyli ty...

P.S. Najprostrze rozwiązania są w większości przypadków jedynie słusznnymi... smile.gif


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
menic
post 1.12.2003, 13:18:09
Post #6





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


@Bakus bumelang juz o tym wspomnial i wyjasnij + i - :wink:


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
bumelang
post 1.12.2003, 14:23:12
Post #7





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 30.11.2003

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


spenalzo:
To jest przechodzenie przez drzewo w tzw. porządku wzdłużnym, tylko że dopasowanym do drzew niebinarnych, czyli odwiedzasz korzeń, potem jego potomoków poczynajac od lewego i konczac na prawym (rekurencyjnie wywolujesz te sama metode z warunkiem stopu na lisciach: wezel != null). Wewnątrz procedury wchodzac w skrajne lewe poddrzewo nadajesz wezel.lft = i+1 natomiast wchodzac juz w skrajne prawe wezel.rgt = i+1, gdzie i jest zmienną globalną.

Sęk w tym, że w bazach lepszych niż MySQL, typu choćby PostgreSQL, robi się to procedurami w bazie, a ciężko mi powiedzieć, jak MySQL sobie z takowymi radzi i czy w ogóle, bo go nie widziałem na oczy od wersji 3.x.

Wydaje mi się, że Bakus ma trochę racji o tyle, że w tym konkretnym przypadku możnaby ograniczyć całą tę zabawę do przechowywania wskaźników do ojca, "dziadka" i "pradziadka" smile.gif, a potem oczywiście
[sql:1:f768448c86]SELECT * FROM users WHERE father=$father;[/sql:1:f768448c86], i dwa następne zapytania dla pradziadek = pradziadek i dziadek = dziadek.

Wątpie jednak, Bakusie, czy ma sens całkowicie znormalizowana struktura, tj. tylko z ojcem, bo liczba zapytań do bazy będzie co najmniej 2 razy taka jak w powyższym rozwiązaniu, a te jak wiadomo zawsze są bardzo kosztowne.
Go to the top of the page
+Quote Post
bumelang
post 1.12.2003, 14:35:59
Post #8





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 30.11.2003

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


Jak zawsze przeczytałem swojego posta dopiero po wysłaniu i stwierdziłem, że strasznie zaciemniłem tę procedurą do przeglądania wzdłużnego. Więc teraz zapisuję w pseudokodzie, żebyś się mógł przejść po drzewku i zobaczyć jak to działa smile.gif:
Kod
procedure ogladacz(wezel)

begin

  if(wezel != NULL)

  begin

    wezel.lft = i+1;

    weź pierwsze dziecko od lewej;

    while(sa jeszcze dzieci)

    begin

       ogladacz(dziecko);

       weź następne dziecko;

    end

    wezel.rgt = i+1;

  end

end


Pozdrowienia
Go to the top of the page
+Quote Post
Bakus
post 2.12.2003, 01:47:10
Post #9


Administrator serwera


Grupa: Przyjaciele php.pl
Postów: 909
Pomógł: 0
Dołączył: 12.08.2003
Skąd: /var/www/wroclaw.php

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


Ups... sorki faktycznie... szybko czytając, wątek nie zgłębiłem sensu...

Usuwał nie będe, bo mnie moja wypowiedź wydaje czytelniejsza... Nie ubliżając nikomu!

Jeszcze raz sorki...


--------------------
Powrót do przeszłości :)
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post 8.01.2004, 22:41:45
Post #10





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

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


http://www.depesz.pl/various-sqltrees.php
Go to the top of the page
+Quote Post
a1internet
post 11.01.2004, 22:54:29
Post #11





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 11.01.2004
Skąd: Gdynia

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


Cytat
W jaki sposób rozpracować strukture tych powiazań i w jakim stopniu przerzucić "ciężar"  tych powiązań na php a w jakim stopniu na MySQLa?


Śliczny schemat smile.gif
Najpierw przeczytaj rekomendowaną już wyżej stronę (http://www.depesz.pl/various-sqltrees.php), a potem wykorzystaj klasę Tree z PEAR-a (http://pear.php.net/package/Tree).


--------------------
Michał Jaskólski
A1 Internet // inżynierowie infostrady // http://www.a1.pl
:: płatne wsparcie techniczne dla PHP, MySQL i Apache
Go to the top of the page
+Quote Post
spenalzo
post 11.01.2004, 22:55:54
Post #12





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

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


W sumie to mam już rozwiązane, jak bede miał więcej czasu to opisze smile.gif


--------------------

Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 21:51