![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 150 Pomógł: 3 Dołączył: 15.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mam taki zestaw tabel:
użytkownik (z uzytkownikami systemu) grupy (grupy do ktorych moze zapisac sie uzytkownik) (np A, B, C , D , E ...) uzytkownicy_grupa (relacjz zawierająca informacje o grupac do ktorych jest zapisany użytkownik) załóżmy że użytkowników jest milion a grup 10-20 więc wydajność ma znaczenie. schamt jest taki użytkownik 1 - N użytkownicy_grupa N <- 1 grupy Jak najwydajniej zapytać się o użytkowników należących do grupy A, B i C: Przychodzą mi do głowy 3 rozwiązania po 1: - totalnie lame - umieścic w tabeli użytkownicy spis grup po przecinku i użyć LIKE po 2: - wykorzystanie zmiennej typu array - to też nie wygląda na idealne rozwiązanie ponieważ jest ograniczenie przy przeszukiwaniu zmiennych array, można jedynie użyć any lub all (+ na PostgreSQL napisano Tip: Arrays are not sets; searching for specific array elements may be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale up better to large numbers of elements. ) po 3: - używanie subselecta na zasadzie
Ma ktoś jakieś lepsze rozwiązania lub umie uzasadnić które wybrać i dlaczego? Ten post edytował kris2 21.08.2007, 19:40:38 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 150 Pomógł: 3 Dołączył: 15.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Po wstępnych testach moge powiedzieć że wygląda na to że liczenie wszystkiego na bitach jest kilka razy szybsze niż używanie subselectów i dodatkowej tabeli. Nie wiem jak bedzie z updatami, bo tego nie sprawdzalem ale one maja dla mnie akurat mniejsze znaczenie. Jedyny minus jest taki że zapytanie na bitach nie wykorzystuje indexów.
Tylko ja mam na tyle specyficzny przypadek że ograniczenia zasięgu będą na obu tabelach więc to nie ma znaczenia. Testy robiłem na tabeli 1,5mln rekordów na bazie PostgreSQL. Niestety nie zdążyłem przetestować wszystkoego co chciałem ale jak mi się uda to to tutaj opisze. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 11.10.2025 - 02:57 |