Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wielokrotnie zagnieżdżone relacje kilku tabel, Jak zminimalizować ilość zapytań do bazy
Snoopy
post
Post #1





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 5.02.2006

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
wNogachSpisz
post
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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

Ten post edytował wNogachSpisz 4.05.2012, 19:57:34
Go to the top of the page
+Quote Post
tehaha
post
Post #3





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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.
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 Aktualny czas: 19.08.2025 - 11:02