Ich bin es gewohnt, Tabellenzeilen mit Spalten wie "DeletedDate" zu sehen, und ich mag sie nicht. Der Begriff "gelöscht" bedeutet, dass die Eingabe nicht an erster Stelle hätte erfolgen dürfen. Sie können praktisch nicht aus der Datenbank entfernt werden, aber ich möchte nicht, dass sie mit meinen aktuellen Daten in Kontakt kommen. Logisch gelöschte Zeilen sind per Definition kalte Daten, es sei denn, jemand möchte ausdrücklich gelöschte Daten sehen.
Darüber hinaus muss jede geschriebene Abfrage sie ausdrücklich ausschließen und Indizes müssen sie ebenfalls berücksichtigen.
Was ich sehen möchte, ist eine Änderung auf der Ebene der Datenbankarchitektur und der Anwendungsebene: Erstellen Sie ein Schema mit dem Namen "gelöscht". Jede benutzerdefinierte Tabelle hat im Schema "Gelöscht" ein identisches Äquivalent mit einem zusätzlichen Feld, das Metadaten enthält - den Benutzer, der sie wann gelöscht hat. Fremdschlüssel müssen erstellt werden.
Als nächstes werden Löschvorgänge zu Einfügelöschvorgängen. Zuerst wird die zu löschende Zeile in das entsprechende Schema eingefügt. Die betreffende Zeile in der Haupttabelle kann dann gelöscht werden. Zusätzliche Logik muss jedoch irgendwo entlang der Linie hinzugefügt werden. Fremdschlüsselverletzungen können behandelt werden.
Fremdschlüssel müssen ordnungsgemäß behandelt werden. Es ist keine gute Praxis, eine Zeile logisch löschen zu lassen, deren primäre / eindeutige Spalte jedoch Spalten in anderen Tabellen enthält, die darauf verweisen. Das sollte sowieso nicht passieren. Ein regulärer Job kann Witwenzeilen entfernen (Zeilen, deren Primärschlüssel trotz eines Fremdschlüssels keine Referenzen in anderen Tabellen enthalten). Dies ist jedoch eine Geschäftslogik.
Der Gesamtnutzen ist die Reduzierung der Metadaten in der Tabelle und die damit verbundene Leistungsverbesserung. Die Spalte 'deletedDate' besagt, dass diese Zeile eigentlich nicht hier sein sollte. Der Einfachheit halber lassen wir sie dort und überlassen sie der SQL-Abfrage. Wenn eine Kopie der gelöschten Zeile in einem "gelöschten" Schema gespeichert wird, enthält die Haupttabelle mit den aktuellen Daten einen höheren Prozentsatz aktueller Daten (sofern diese rechtzeitig archiviert werden) und weniger unnötige Metadatenspalten. Indizes und Abfragen müssen dieses Feld nicht mehr berücksichtigen. Je kürzer die Zeilengröße, desto mehr Zeilen können auf eine Seite gepasst werden, desto schneller kann SQL Server arbeiten.
Der Hauptnachteil ist die Größe der Operation. Es gibt jetzt zwei Operationen anstelle von einer sowie die zusätzliche Logik und Fehlerbehandlung. Dies kann zu mehr Sperren führen, als das Aktualisieren einer einzelnen Spalte andernfalls erfordern würde. Die Transaktion hält die Tabelle länger gesperrt, und es handelt sich um zwei Tabellen. Das Löschen von Produktionsdaten wird, zumindest nach meiner Erfahrung, nur selten durchgeführt. Trotzdem haben 7,5% von fast 100 Millionen Einträgen in einer der Haupttabellen einen Eintrag in der Spalte "DeletedDate".
Zur Beantwortung der Frage müsste die Anwendung die Funktion "Wiederherstellen" kennen. Dies müsste einfach in umgekehrter Reihenfolge geschehen: Fügen Sie die Zeile aus dem 'gelöschten' Schema in die Haupttabelle ein und löschen Sie dann die Zeile aus dem 'gelöschten Schema. Auch hier ist eine zusätzliche Logik- und Fehlerbehandlung erforderlich, um Fehler, Probleme mit Fremdschlüsseln und dergleichen zu vermeiden.