Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wielokrotnie zagnieżdżone relacje kilku tabel
Forum PHP.pl > Forum > PHP
Snoopy
Witam,

mam w bazie danych kilka tabel (A, B, C itp.). W każdej tableki są rekordy posiadające unikatowy ID oraz ID rekordu w innej lub tej samej tabeli do którego on przynależy i tak według poniższego schematu: dla rekordu id 1 tabeli C, nadrzędnym rekordem jest rekord o ID 3 z tabeli B. Dla niego zaś nadrzędnym jest rekord z tej samej tabeli ale o ID 2. Ten rekord posiada nad sobą kolejny ale już z tabeli A i na tym koniec. Obrazuje to drzewko które paskudnie naskrobałem poniżej. Sprawa wygląda tak. Mam 3 klasy w php aObj, bObj i cObj. stworzyłem na ich podstawie tyle obiektów ile jest rekordów w danej tabeli ale tylko te których id_a= np. 1

więc mam obiekt objA[0], objB[0-5] i objC[0-2]

wszystko pięknie ale chciałbym uzyskać właśnie takie drzewko. Nie wiem za bardzo jak połączyć obiekty ze sobą. Mógłbym zacząć tworzyć zapytania do MySQL kaskadowo zaczynając od pierwszego najwyższego węzła aż do tabeli C ale w takim przypadku byłoby mnóstwo zapytań na każdym szczeblu.

Wydaje mi się że 3 zapytania i wrzucenie w obiekty każdego rekordu celem późniejszej dalszej obróbki jest wydajniejsze i szybsze niż ciągłe odpytywanie bazy danych o kolejny rekord. Tu pytam o całą tabelę a w poprzednim wypadku musiałbym przy każdym nowym rekordzie zadawać bazie nowe zapytanie.

Mój problem to właśnie ta późniejsza obróbka. Każdy obiekt jest elementem tablicy (np. aObj[2]) żeby przypisać do niego element musiałbym przeszukać całą tablicę gdzie aObj[$i]->id_a == cośtam

to też nie wydaje się szybkie. Przypomina funkcje sortujące które do najwydajniejszych nie należą.

Jak to ugryźć?

Kod
A    |B                 |C
---------------------------------------------
id_a | id_b id_b* id_a  | id_c id_b id_a
---------------------------------------------
   1 |    1          1  |    1    3    1
   2 |    2          1  |    2    5    1
     |    3    2     1  |    3    6    1
     |    4    2     1  |    4    7    2
     |    5    4     1  |
     |    6          1  |
     |    7          2  |
     |    8          2  |



Jako drzewko, wygląda to docelowo tak:

Kod
A1
|
|-B1
|-B2
| |
| |-B3
| | |
| | |-C1
| |
| |-B4
|   |
|   |-B5
|     |
|     |-C2
|
|-B6
  |
  |-C3

A2
|
|-B7
| |
| |-C4
|
|-B8
wNogachSpisz
Nic nie rozumiem, ogólnie to mam alergie na ludzi którzy przychodzą na forum z problemem z życia wziętym i nawet nie zadają sobie trudu aby przykład możliwie uprościć …

Mimo to dam Ci coś do przegryzienia:

1. metody reprezentacji danych hierarchicznych w bazach relacyjnych.
W CakePHP jest to zgrabnie zaimplementowane pod nazwą "model tree behavior" http://book.cakephp.org/1.3/view/1339/Tree
Samego CakePHP nie polecam, jest cholernie zamulone, bez cachowania wszystkiego nie daje się zrobić Hello-World.

2. użycie SQLite i baz tymczasowych – tutaj opisuje rozwiązanie na redukcje ilości zapytań.
Z grubsza polega to na tym, ze walisz możliwie najmniej selektywne zapytanie na głównej bazie, czyli wyciągasz za jednym zamachem wszystkie dane które będą Cię interesować podczas pracy danej instancji skryptu, następnie wynikami wypełniasz tymczasową baze SQLite utworzona przy pomocy sqlite_open(':memory') i taką bazę maltretujesz dowolną ilością zapytań. Demon szybkości to nie jest, ale za to kod PHP staje się super czytelny.

Pozdro600
tehaha
Hej,
myślę, że dobrze by było gdybyś zaczął od opisania charakterystyki problemu, a nie tego co wydaje Ci się jego rozwiązaniem. Twój opis nie daje zbyt wielkiego pola manewru bo jedynie można zrobić tak jak wspomniałeś - pobrać wszystko trzema zapytaniami i dalej obrabiać w php. No bo tak właściwie to czemu dane należące do tej samej struktury hierarchicznej są rozbite na różne tabele? Jeżeli zawierają jakieś dodatkowe informacje to całą hierarchię można by trzymać w jednej tabeli i tylko dołączać dane z innych tabel, wtedy wszystko masz jednym zapytaniem a obróbka jest szybka i banalna. Ciężko coś powiedzieć bo nie dałeś konkretów.
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.