Soft Delete w SQL Server i EF Core — wygoda, która może stworzyć problemy
Soft Delete polega na oznaczeniu rekordu jako usuniętego bez fizycznego usunięcia go z tabeli.
Najczęściej dodajemy IsDeleted, DeletedAt i DeletedBy.
Rozwiązanie wpływa jednak na unikalność, indeksy, relacje, raporty i retencję.
Przykładowy model
| |
Problem z unikalnością
Zwykłe ograniczenie UNIQUE uniemożliwi ponowne użycie adresu po soft delete.
Rozwiązaniem jest filtrowany indeks:
| |
Global Query Filter w EF Core
| |
Aby pominąć filtr:
| |
Relacje i kaskady
Co ma się stać z zamówieniami po soft delete klienta?
Możliwe warianty:
- zamówienia pozostają widoczne,
- stają się niewidoczne,
- również otrzymują soft delete,
- usunięcie klienta jest zabronione.
Regułę trzeba zaprojektować jawnie.
Audyt
Soft Delete nie jest pełnym audytem. Nie pokazuje historii wartości ani przyczyny zmiany.
Do pełnej historii mogą być potrzebne:
- tabele temporalne,
- tabela audytowa,
- CDC,
- log aplikacyjny.
Podsumowanie
Soft Delete jest wzorcem biznesowym, a nie tylko dodatkową kolumną.
Spokojny projektant pyta:
Dlaczego dane mają pozostać, kto może je zobaczyć i co oznacza ich przywrócenie?