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:
-
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.
-
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.
-
Inne pomysly?
Co sadzicie na ten temat?