[SQL] Zgrupowałem rekordy po 8 kolumnach, teraz muszę pokazać rekordy dla grupy

0

Cześć,

Mam sporą zagwozdkę z tym tematem. W widoku mam dwustopniową tabelę, w której wpierw grupuję rekordy po 8 kolumnach, a następnie po wybraniu konkretnej grupy mam pokazać rekordy z tejże grupy. To nie jest przypadek, w którym grupa ma jakieś ID, bo grupowanie odbywa się w locie, na poziomie zapytania (baza danych jest zewnętrzna, nie mogę modyfikować struktury). Z rożnych względów, przekazywanie 8 parametrów z widoku do backendu wykonującego zapytania wydaje się mało eleganckie i szukam czegoś lepszego.

Jest jakiś pattern na to - jakaś md5 z paramsów i oranie bazy? :D

0

co???

0
abrakadaber napisał(a):

co???

  1. Podłączam się do bazy danych pełnej dość "szerokich" rekordów (wielokolumnowych). Usera interesuje dajmy na to - 8 kolumn.
  2. Z niej muszę wybrać te rekordy dla konkretnego usera, żeby zoptymalizować UX sklejam te, które są identyczne - jedyne co je różni, to unikalne ID. Robię to za pomocą GROUP BY na tych 8 kolumnach (gubię w ten sposób ich unikalne ID) i dodaję COUNT.
  3. Pokazuję rekordy w tabeli, a te które mają kilka identycznych duplikatów, mają w kolumnie "ilość" wartość > 1.
  4. Po kliknięciu na wybrany rząd tabeli wyskakuje modal, prezentujący listę wszystkich identycznych rekordów (które macierzysta tabela zlepia w jeden + COUNT), wraz z ich unikalnymi ID - po co, to już inna historia.

Żeby wybrać te rekordy, muszę zrobić SELECT ... WHERE i tu podać jako warunki wartości dla każdej kolumny użytej do grupowania.

Pytanie jest takie, czy da się to zrobić jakoś lepiej - tak, żeby między UX a logiką biznesową nie latało 8 wartości aby pobrać rekordy - nazwijmy to - szczegółowe.

0

jak nie masz żadnego pojedynczego klucza identyfikującego grupę to musisz do WHERE przekazać wartości wszystkich kolumn, które jednoznacznie tę grupę identyfikują. W skrajnym przypadku może to być wszystkie 8 wartości. Baza wróżyć nie umie a i w domyślaniu się jest cienka - nie ten poziom AI.

0

Dzięki, choć myślę, że nie jestem aż tak tępy, jak założyłeś ;).

Gdybym miał możliwość ingerencji w tę bazę, to np. do każdego rekordu można dołożyć kolumnę w stylu indeksu - md5 z tych 8 wartości i przekazywać wtedy ten ciąg, gdy chcemy rozwinąć grupę. Baza jest jednak modyfikowana prawie na okrągło, musiałbym założyć jakieś triggery.

Stanęło na tym, że zserializuję wartości z kolumn do tablicy i przekażę do backendu, gdzie czeka tłuste WHERE.

Pozdrowienia

0

Mały update.

Dołożyłem kolumnę liczącą skrót z kolumn (f-cja HASHBYTES w T-SQL). Zgrupowane zbiory mają max kilkaset rekordów, więc liczy się bardzo szybko.

Zapytanie wybierające już pojedyczne rekordy po samym hashu było bardzo wolne (ok 6 sekund), ale po ograniczeniu zbioru przez dodanie choćby dwóch dodatkowych kolumn do WHERE zapytania trwają zdecydowanie poniżej sekundy. To raczej akceptowalny wynik dla moich userów.

Plusem takiego rozwiązania jest to, że nie muszę ujawniać po stronie klienta wartości wszystkich kolumn użytych do grupowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1