Muszę najpierw wyjaśnić, że kolumna stanu nie ma na celu odzwierciedlać statusu przedmiotu rzeczywistego reprezentowanego przez rekord (wiersz) w tabeli. Ma raczej na celu pokazanie stanu samego rekordu.
Może być tak prosty jak Aktywny / Nieaktywny lub skomplikowany jak Zatwierdzony / Usunięty / Zablokowany / Oczekujący / Odrzucony itp. Status może być przechowywany w kolumnie logicznej / krótkiej liczbie całkowitej lub kolumnie jednoznakowej, z odwzorowaniami jak true
/ 1
= Aktywny lub A
= Zatwierdzony.
Podstawową ideą jest posiadanie w aplikacji obsługi odzyskiwania przypominającego kosz / kosz w aplikacji (i symulowanie jej w bazie danych). Jeśli istnieje interfejs GUI lub inny interfejs, który rzekomo pozwala użytkownikowi „usuwać” rekordy, tak naprawdę nie usuwa rekordu w tabeli, ale po prostu zmienia status rekordu na Nieaktywny lub Usunięty. Gdy interfejs pobiera rekordy, zawsze otrzymuje rekordy, które pasują tylko pod warunkiem, że status jest Aktywny lub Zatwierdzony.
Jeśli użytkownik popełni błąd i konieczne będzie odzyskanie „usuniętego” rekordu (z perspektywy użytkownika), DBA może łatwo załatać ten rekord z powrotem do stanu Aktywny lub Zatwierdzony, co byłoby lepsze niż wyszukiwanie kopii zapasowych i, mam nadzieję, znalezienie oryginalnego rekordu tam. Albo sam interfejs może pozwolić użytkownikowi przeglądać usunięte rekordy w osobnym widoku i przywracać je w razie potrzeby, a nawet trwale je usuwać (usuwając aktualny rekord).
Moje pytania:
- Czy to dobra praktyka, czy zła praktyka?
- Czy wpływa to na normalizację danych?
- Jakie są potencjalne pułapki?
- Czy istnieje alternatywna metoda osiągnięcia tego samego celu? (patrz uwaga)
- W jaki sposób baza danych może wymuszać unikalne ograniczenia danych tylko dla określonego statusu (ale dopuszczać dowolną liczbę duplikatów dla innych statusów)?
- Dlaczego bazy danych nie oferują natywnej funkcji „kosza” lub śledzenia / odzyskiwania tabeli, aby umożliwić interfejsom usuwanie faktycznych rekordów bez obaw?
Uwaga: Czytałem o utrzymywaniu osobnej tabeli historii, ale wydaje się to gorsze pod względem pamięci i konieczności generowania wyzwalaczy i aktualizowania wyzwalaczy zgodnie ze schematem śledzonej tabeli.