Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Soft deleting a obiekty w relacji
Forum PHP.pl > Forum > PHP
markonix
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
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
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).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.