Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych kilkoma zapytaniami czy przez join?
Forum PHP.pl > Forum > Bazy danych > MySQL
awakening
Witam,

mam bazę danych zbudowaną częściowo relacyjnie (celowo jest tylko częściowo) i chciałbym z tej bazy pobrać dane z wszystkich tabel i w tym momencie pojawia się problem gdyż teoretycznie mogę dostać się do wszystkich danych jednym zapytaniem jednak wtedy tworzy mi się ogromna tablica z duplikującymi się danymi (np, w jednej tabeli mam 2 rekordy, a w drugiej 30 rekordów powiązanych z tymi pierwszymi, jak w następnych też jest różna liczba rekordów to wiadomo co się dzieje) i teraz mam pytanie, czy lepiej pobrać te dane kilkoma zapytaniami (3-4) i mieć tylko to co się chce w kilku mniejszych tablicach, czy lepiej pobierać wszystkie do jednej dużej tablicy (100-150 elementów), a później to rozbijać na mniejsze tablice jakąś funkcją, przeszukując tą dużą tablicę itp? Zatrzymałem się w miejscu, a nie chce przerabiać wszystkiego co do tej pory stworzyłem, pomocy sciana.gif
Crozin
Pokaż jaką masz strukturę danych oraz co dokładnie chcesz dostać.
awakening
Struktura jest cholernie skomplikowana i nie wiem czy ktoś będzie się w stanie w niej połapać: http://img5.imageshack.us/i/bazahxc.jpg/ muszę pobrać rekordy z tabel objects, obj_foto, atrybuty, localization, categories, pozostałe tabele w mniejszym lub większym stopniu opisują relację między tablą objects a tymi, które chce pobrać, generalnie interesuje mnie czy jeżeli wykonam to kilkoma zapytaniami to czy będzie to jak bardzo spadnie mi wydajność aplikacji?
Crozin
Przede wszystkim bądź konsekwentny i jak raz dajesz angielską nazwę to całej reszcie też.

To, że będziesz miał całą masę INNER JOINów raczej nie przeszkadza. Ważne byś miał poprawnie pozakładane indeksy (EXPLAIN SELECT... będzie pomocne).

Swoją drogą: źle wymyśliłeś przypisywanie obiektu do kategorii (na zasadzie jedna kolumna - kategoria główna, druga kolumna - podkategoria). Określ najgłębszą kategorię, a kategorie zrób na zasadzie drzewa.
awakening
No nie pomagasz mi w ten sposób, takie szczegóły nie mają nic wspólnego z moim problemem... wiem, że masa inner joinów nie przeszkadza w zapytaniu, pod względem wydajności, ale tworzy mi się z tego tablica która może zawierać nawet kilkaset dublujących się elementów, przez to, że do jednego rekordu z obiektem może być przypisanych kilkadziesiąt atrybutów, kilka zdjęć i kilka kategorii, więc w rezultacie otrzymuję np. coś takiego: http://img200.imageshack.us/img200/73/wyniks.jpg Gdybym wykonał kilka zapytań to miałbym oddzielną tablicę np. z 6 zdjęciami, tablice z 2 kategoriami, tablicę z 30 atrybutami i tablicę z jednym obiektem, a teraz mam wielką tablicę z iloczynem kartezjańskim wszystkich rekordów, czyli jeżeli mam 30 atrybutów to mam tez 30 razy powieloną nazwę obiektu itd. sciana.gif
Crozin
Hmm... to zaproponuję Ci najprostsze rozwiązanie. Wrzuć do tabel po 20 000 przykładowych rekordów i sprawdź oba sposoby. Na moje oko zrobienie tego tak jak to teraz wygląda wypadnie najlepiej, ale niczego sobie uciąć nie dam.
awakening
Rozbiłem to na pięć zapytań (niektóre z join inner i join left) i mam pobrane wszystkie dane które mnie interesując w 5 oddzielnych tablicach smile.gif w ten sposób będę wyświetlał wszystkie szczegóły obiektu na podstronie obiwktu, więc nie powinno to zabić bazy, wyniki wyszukiwania będą pobierane jednym zapytaniem smile.gif
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.