2017-07-13 2 views
0

Kürzlich stolperte ich über folgendes Problem: Gegeben ist ein einfaches Datenmodell mit "Books" und "Authors". Jedes "Buch" hat einen Verweis auf einen "Autor". Persistenz wird mit einer relationalen Datenbank erreicht. Neben dem Hinzufügen von Büchern und Autoren ist es auch möglich, sie zu löschen. Normalerweise, wenn ich einen Autor löschen möchte, würde ich eine SQL DELETE Operation ausführen und die entsprechende Zeile entfernen. Allerdings habe ich in anderen Projekten gesehen, Leute rufen nicht DELETE. Stattdessen fügen sie irgendeine Art von aktivem/gelöschtem Flag hinzu und markieren die entsprechende Zeile als "gelöscht".Relationale Datenbank: DELETE versus "Zum Löschen vormerken"

Meine Fragen sind: Ist dies in der Regel Best Practice? Was sind die Vorteile? Meine beste Vermutung ist:

  • Festlegen eines Flag hat eine bessere Leistung als ein DELETE Betrieb
  • Wenn Sie aus dem Raum laufen, ist es immer noch möglich, eine Bereinigung Dienst auszuführen, die für gelöschte Objekt sucht und entfernt die entsprechenden
  • Reihen
  • eine Lösch Flag Einstellung ist für die Konsistenz der Datenbank besser, weil eine Deletion von „Autor“ in dem obigen Beispiel Fremdschlüssel in den entsprechenden „Bucheinträge zerstören könnte.

Wie auch immer, das sind nur Vermutungen. Hat jemand kenne die Antwort ?

Antwort

2

Es gibt viele Gründe, delete nicht zu verwenden. Erstens kann die Aufrechterhaltung der Geschichte sehr wichtig sein. Ich würde nicht "nur" eine Löschflagge verwenden, sondern stattdessen Gültigkeitsdaten.

Zweitens kann in einem Betriebssystem delete eine teure Operation sein. Die Zeile muss aus den zugehörigen Indizes aus der Tabelle gelöscht werden, und dann können überlappende Löschungen und Trigger auftreten.

Drittens kann delete verhindern, dass andere Operationen gut funktionieren, weil Tabellen und Zeilen und Indizes gesperrt werden. Dies kann ein Betriebssystem insbesondere in Spitzenzeiten verlangsamen.

Vierte, delete kann schwierig sein, relationale Integrität zu erhalten - vor allem, wenn diese kaskadierenden Löschungen nicht definiert sind.

Fünftens ist die Lagerung billig. Verarbeitungsleistung ist billig. Für viele Datenbanken ist das Löschen von Datensätzen zur Wiederherstellung von Speicherplatz einfach unnötig.

Dies bedeutet nicht, dass Sie immer vermeiden sollten, Datensätze zu löschen. Aber es gibt sehr gute Gründe dafür, nicht zu hetzen, um Daten zu entfernen.