markonix
29.02.2016, 12:00:26
Jak rozwiązuje sytuacje gdy .. na przykładzie:
Mamy tablicę/obiekt klasa, ta ma pod sobą lekcje i jeszcze po nią mamy oceny.
I teraz powiedzmy, że dana klasa została usunięta i liczymy jakąś średnią ocen dla szkoły.
W systemie korzystam z soft delete czyli (int) kolumna "deleted".
I teraz pytanie. Jako, że tylko klasa ma status "deleted" oceny są nieruszone. Jak to rozwiązać?
Gdybym korzystał z twardego usuwania to klucze obce by rozwiązały problem bo wraz z klasą wyleciałoby wszystko co po nią.
1) JOINowanie obiektów nadrzędnych i sprawdzanie warunku = 0?
2) Usuwanie masowym update obiektów podrzędnych set deleted = 1?
3) Może na poziomie DB da się to jakoś obsłużyć?
4) Inny sposób?
vokiel
29.02.2016, 13:59:23
Usuwanie wszystkiego nie ma sensu, bo zamiast jednego update musiałbyś zrobić ich dużo więcej, poza tym tracisz w ten sposób informację o tym co zostało usunięte.
Najważniejszy przypadek, który dyskwalifikuje takie rozwiązanie: nauczyciel wpisał uczniowi ocenę, ale niechcący nie temu co trzeba, więc usuną błędną (deleted=1) i dodał nową, prawidłową. Teraz usuwasz całą klasę i orientujesz się, że sorry, ale to nie ta klasa miała być usunięta - więc przywracasz. Jeśli byś robił masowe update deleted=1 dla wszystkich ocen to w momencie próby przywrócenia klasy nie wiadomo by było które oceny przywrócić, a które zostawić usunięte.
Zatem JOIN jest IMHO najlepszym rozwiązaniem.
markonix
29.02.2016, 14:18:51
Teraz stosuje JOINy tylko słabe to jest troszkę ze względu na wiele poziomów relacji.
Wymaga też dużej konsekwencji przy budowaniu zapytań.
Choć to co napisałeś - oczywiście dyskwalifikuje te rozwiązanie chociaż można by się pokusić o opieranie się o timestpamy (zamiast deleted 0/1 używa się unix time co czasem faktycznie się przydaje).