Wirtualne kolumny z agregatami?

0

Witam, mam taki schemat bazy danych (chodzi o SQLite na Androidzie, ale pytanie raczej ogolne):

TestGroup:
_id name (text)

Test:
_id _test_group_id name (text) enabled (Y/N)

Task:
_id _test_id question (text) answer (text) favorite (Y/N)

Czyli:

  • TestGroup ma wiele testow, z ktorych czesc moze byc aktywna a czesc nie, i kazdy test nalezy tylko do jednej grupy
  • Test ma wiele zadan, z ktorych niektore sa ulubione

Aplikacja ma etap importu z pliku, podczas ktorego plik jest parsowany i z danych tworzona jest jedna grupa testowa, z potencjalnie wieloma testami, ktore z kolei maja wiele taskow - tutaj wykonywane sa inserty: 1 dla grupy, po jednym dla testu, i po jednym dla kazdego taska. Nastepnie, podczas normalnego uzytkowania, aplikacja dokonuje tylko selecty (lista grup testowych, lista testow dla wybranej grupy, i taski dla kombinacji testow z danej grupy) oraz updaty kolumny 'ulubione'.

Gdy pobieram liste aktywnych testow dla danej grupy, chce pobrac tez informacje czy ma jakies ulubione zadania (nie potrzebuje konkretnej liczby, tylko informacje tak/nie). Podobnie, jak pobieram liste grup to chce rowniez dostac informacje o tym czy one ma aktywne testy, ktore maja ulubione zadania.

Aktualnie mam to zrobione na joinach itp. ale jakos nie jestem do tego rozwiazania przekonany: te zapytania sa dosc skomplikowane (prosze mnie nie wysmiewac, wiem ze ludzie tutaj pisza procedury na kilka stron A4, ale tu chodzi o w sumie dosc prosta aplikacje) i inni sobie z nimi nie radza. Z tego powodu zastanawiam sie nad innymi rozwiazaniami:

  1. Wprowadzic denormalizacje - w sumie nie wiem czy to sie tak nazywa, w sumie chodzi mi o 'wirtualne' kolumny ktore przechowuja agregaty. Np. w tabeli Test bym dodal kolumne _favorite_count, i w momencie gdy jakis task z danego testu jest updatowany, gdy jego wartosc dla 'favorite' jest zmieniana na Y to dodaje testowi w jego _fav_count + 1, a gdy zmieniana na N to robie _fav_count - 1. Moze sie to odbywac np. w triggerze w ktorym ma dostep do starej i nowej wartosci, albo jako jawny update, nie jestem pewien co lepsze (w sumie triggery sa dosc niejawne...). Podobnie zrobilbym dla grupy testowej.

  2. Zamiast wprowadzac sztuczne kolumny, zrobilbym widoki ktore bylyby nadzbiorami tabel plus _fav_count Wszystkie zapytania bym kierowal do tych widokow. Tutaj mam troche obawy o performance poniewaz takie widoki sa chyba obliczane ad-hoc i spowalnialoby to zapytania? Nie pozbylbym sie rowniez joinow.

  3. Inne pomysly?

Co sadzicie na ten temat?

0

myślę, że dodatkowa kolumna i triggery na "pozycjach" załątwią sprawę i będzie to najrozsądniejsze wydajnościowo

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