Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja układu tabel / zapytań
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Załóżmy taki uproszczony przykład. Mamy 3 tabele
kolekcja_eksponatów, eksponat (zawiera klucz obcy id_kolekcji i id_kategorii), kategoria eksponatu . Kolekcja eksponatów grupuje eksponaty za pośrednictwem łączącej tabeli.

Zadanie to wyszukać kolekcje, która zawierają eksponaty TYLKO określonych kategorii - czyli jeśli np. użytkownik wybierze zabytki Egtipu, zabytki Syrii to zwrócona kolekcja nie może zawierać innych eksponatów. Użytkownik ma do wyboru około 150 kategorii i szukając kolekcji zazwyczaj wybierze około 70-120 kategorii.

Teraz pytanie czy da się jakoś uprościć (myślę tu o jakimś cache) zapytanie, tak żeby w kolekcji zapisać jakie zabytki zawiera i nie musieć szukać za każdym razem w elementach kolekcji. Myślałem o czymś na zasadzie maski bitowej, która byłaby kalkulowana dla kolekcji i zapytania i ze sobą porównywana, ale 150 kategorii to sporo i chyba na maskę za dużo?

Macie jakieś pomysły jak to obejść.

Dodam, że w prawdzimym przykładzie dotarcie do elementów składowych kolekcji jest jeszcze bardziej skomplikowane bo jest kilka tabel "po drodze", więc wyszłoby z tego jakieś masakrujące zapytanie.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


... HAVING COUNT(DISTINCT id_kolekcji)=1
Sorry, myslalem, ze tylko z jednej kolekcji
Ale jesli z okreslonej liczby kolekcji (przy zalożeniu, że NAJWYŻEJ z tej liczby) to tak:
... HAVING COUNT(DISTINCT id_kolekcji)<=liczba_wybranych_kolekcji

Ten post edytował mmmmmmm 27.09.2014, 12:54:21
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 14.09.2025 - 23:18