Datenbank: Zum Löschen oder Nichtlöschen von Datensätzen

117

Ich glaube nicht, dass ich die einzige Person bin, die sich darüber wundert. Was üben Sie normalerweise über das Datenbankverhalten? Möchten Sie einen Datensatz lieber physisch aus der Datenbank löschen? Oder ist es besser, den Datensatz nur mit einem "gelöschten" Flag oder einer booleschen Spalte zu kennzeichnen, um anzuzeigen, dass der Datensatz aktiv oder inaktiv ist?

jerbersoft
quelle
67
... ob es in der Datenbank edler ist, das Aufblähen und die Redundanz von Flags zu erleiden oder DELETE zu einer Tabelle von Datensätzen zu bringen und sie durch Entfernen zu beenden. Löschen, schlafen;
Nickf
7
Hallo! Wie stimme ich einen Kommentar ab?
Nifle

Antworten:

48

Dies hängt definitiv vom tatsächlichen Inhalt Ihrer Datenbank ab. Wenn Sie es zum Speichern von Sitzungsinformationen verwenden, löschen Sie es auf jeden Fall sofort, wenn die Sitzung abläuft (oder geschlossen ist), und Sie möchten nicht, dass dieser Müll herumliegt. Da es für praktische Zwecke nicht wirklich wieder verwendet werden kann.

Grundsätzlich müssen Sie sich fragen, ob ich diese Informationen wiederherstellen muss. Wie gelöschte Fragen zu SO sollten sie auf jeden Fall nur als "gelöscht" markiert werden, da wir aktiv ein Wiederherstellen zulassen. Wir haben auch die Möglichkeit, es anzuzeigen, um auch Benutzer auszuwählen, ohne viel zusätzlichen Aufwand.

Wenn Sie nicht aktiv versuchen, die Daten vollständig wiederherzustellen, Sie sie aber dennoch zu Überwachungszwecken (oder ähnlichen Zwecken) aufbewahren möchten. Ich würde vorschlagen, dass Sie (natürlich so weit wie möglich) ein Aggregationsschema herausfinden und dieses auf eine andere Tabelle verschieben. Auf diese Weise wird Ihre Primärtabelle von "gelöschten" Daten befreit und Ihre Sekundärtabelle für Überwachungszwecke (oder was auch immer Sie sich vorgestellt haben) optimiert.

Zeitliche Daten finden Sie unter: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
quelle
30

Vorteile der Verwendung eines Löschflags:

  1. Sie können die Daten später zurückerhalten, wenn Sie sie benötigen.
  2. Der Löschvorgang (Aktualisieren des Flags) ist wahrscheinlich schneller als das eigentliche Löschen

Nachteile der Verwendung eines Löschflags:

  1. Es ist sehr leicht, AND DeletedFlag = 'N'irgendwo in Ihrem SQL zu übersehen
  2. Langsamer für die Datenbank, um die Zeilen zu finden, an denen Sie interessiert sind, unter all dem Mist
  3. Schließlich möchten Sie es wahrscheinlich trotzdem wirklich löschen (vorausgesetzt, Ihr System ist erfolgreich. Was ist, wenn dieser Datensatz 10 Jahre alt ist und 4 Minuten nach seiner ursprünglichen Erstellung "gelöscht" wurde)?
  4. Es kann unmöglich machen, einen natürlichen Schlüssel zu verwenden. Möglicherweise haben Sie eine oder mehrere gelöschte Zeilen mit dem natürlichen Schlüssel und eine echte Zeile, die denselben natürlichen Schlüssel verwenden möchten.
  5. Es kann rechtliche / Compliance-Gründe geben, warum Sie Daten tatsächlich löschen sollen.
WW.
quelle
23

Als Ergänzung zu allen Beiträgen ...

Wenn Sie jedoch vorhaben, den Datensatz zu markieren, sollten Sie eine Ansicht für aktive Datensätze erstellen. Dies würde Sie davor bewahren, das Flag in Ihrer SQL-Abfrage zu schreiben oder zu vergessen. Sie können auch eine Ansicht für nicht aktive Datensätze in Betracht ziehen, wenn Sie der Meinung sind, dass dies auch einen Zweck erfüllt.

Adeel Ansari
quelle
11

Ich bin froh, diesen Thread gefunden zu haben. Auch ich habe mich gefragt, was die Leute über dieses Thema denken. Ich habe das "als gelöscht markiert" seit ungefähr 15 Jahren auf vielen Systemen implementiert. Wann immer ein Benutzer anrief, um zu sagen, dass etwas versehentlich gelöscht wurde, war es sicherlich viel einfacher, es als nicht gelöscht zu markieren, als es neu zu erstellen oder aus einem Backup wiederherzustellen.

Wir verwenden postgresql und Ruby auf Schienen. Es sieht so aus, als könnten wir dies auf zwei Arten tun, Schienen ändern oder einen Ondelete-Trigger hinzufügen und stattdessen eine pl / pgsql-Funktion ausführen, um sie als gelöscht zu markieren. Ich neige mich zu Letzterem.

In Bezug auf Leistungstreffer wird es interessant sein, die Ergebnisse von EXPLAIN-ANALYZE auf großen Tabellen für wenige gelöschte Elemente sowie viele gelöschte Elemente zu sehen.

In Systemen, die im Laufe der Zeit verwendet wurden, neigen neue Benutzer dazu, alberne Dinge wie das versehentliche Löschen von Dingen zu tun. Wenn Personen in einer Position neu sind, haben sie alle Zugriffsrechte der Person, die zuvor in dieser Position war, außer ohne Erfahrung. Wenn Sie versehentlich etwas löschen und sich schnell erholen können, können alle schnell wieder arbeiten.

Aber wie jemand sagte, manchmal benötigen Sie diesen bestimmten Schlüssel aus irgendeinem Grund zurück. An diesem Punkt müssten Sie ihn wirklich löschen und dann die Datensätze neu erstellen (beim Wiederherstellen und Ändern des Datensatzes).

user67403
quelle
1
+1, weil Benutzerfreundlichkeit beinhaltet, meine Fähigkeit, katastrophale Fehler zu machen, einzuschränken.
Jesse
6

Es gibt auch rechtliche Probleme, wenn es um personenbezogene Daten geht. Ich denke, es hängt stark davon ab, wo Sie sich befinden (oder wo sich die Datenbank befindet) und wie die Nutzungsbedingungen lauten.

In einigen Fällen können Benutzer darum bitten, von Ihrem System entfernt zu werden. In diesem Fall ist ein hartes Löschen erforderlich (oder zumindest das Löschen aller persönlichen Informationen).

Ich würde mich bei Ihrer Rechtsabteilung erkundigen, bevor Sie eine Strategie festlegen, wenn es um personenbezogene Daten geht.

Jeremy French
quelle
5

Ich markiere sie als gelöscht und lösche sie nicht wirklich. Ab und zu fege ich jedoch den gesamten Müll heraus und archiviere ihn, damit die Leistung nicht beeinträchtigt wird.

Robert Gould
quelle
2

Wenn Sie Bedenken haben, dass "ruhende" Datensätze Ihren Datenbankzugriff verlangsamen, möchten Sie diese Zeilen möglicherweise in eine andere Tabelle verschieben, die als "Archiv" -Tabelle fungiert.

Kreuzer
quelle
1

Für vom Benutzer eingegebene / verwaltete Daten habe ich die von Ihnen beschriebene Flag-Methode verwendet und dem Benutzer eine Schnittstelle zum Löschen des Papierkorbs gegeben, um Elemente tatsächlich zu löschen, wenn er dies wünscht.

Abie
quelle