Frage

Die Arbeit an einem Projekt zur Zeit und wir müssen weiche Streichung für die Mehrheit der Nutzer (Benutzerrollen) implementieren. Wir beschließen, eine „is_deleted =‚0‘“ Feld auf jede Tabelle in der Datenbank hinzufügen und legen Sie es auf ‚1‘, wenn bestimmte Benutzerrollen treffen eine Löschtaste auf einem bestimmten Datensatz.

Für die zukünftige Wartung jetzt jede SELECT-Abfrage benötigt sie enthalten Aufzeichnungen nicht zu gewährleisten, in denen is_deleted = ‚1‘.

Gibt es eine bessere Lösung für weiche Lösch Umsetzung?

Update:. Ich sollte auch beachten Sie, dass wir eine Audit-Datenbank, die Änderungen (Feld, alter Wert, neuer Wert, Zeit, Benutzer, ip) auf alle Tabellen / Felder innerhalb der Anwendungsdatenbank Titel

War es hilfreich?

Lösung

Sie können alle Ihre Abfragen für eine Ansicht durchführen, die die WHERE IS_DELETED='0'-Klausel enthält.

Andere Tipps

Ich würde lehnen in Richtung „Rails Weg“ mit einer deleted_at Spalte, die die enthält Datumzeit, wann die Löschung erfolgte . Dann erhalten Sie ein wenig freie Metadaten über die Löschung. Für Ihre SELECT nur Zeilen erhalten WHERE deleted_at IS NULL

is_deleted Spalte zu haben, ist ein recht guter Ansatz. Wenn es in Oracle ist, um die Leistung weiter erhöhen würde ich empfehlen, die Tabelle Partitionierung durch eine Liste Partition auf is_deleted Spalt zu erstellen. Dann gelöscht und nicht-gelöschten Zeilen physisch in verschiedenen Partitionen sein, obwohl für Sie transparent sein.

Als Ergebnis, wenn Sie eine Abfrage eingeben wie

SELECT * FROM table_name WHERE is_deleted = 1

dann wird Oracle die ‚Partition Pruning‘ durchführen und nur in die entsprechende Partition aus. Intern eine Partition ist eine andere Tabelle, aber es ist transparent für Sie als Anwender: Sie werden über die gesamte Tabelle, egal wählen können, wenn sie partitioniert ist oder nicht. Aber Oracle Lage sein wird, abfragen nur die Partition muss es . Zum Beispiel lassen Sie sich 1000 Zeilen mit is_deleted = 0 und 100000 Reihen mit is_deleted = 1 annehmen, und Sie in die Tabelle auf is_deleted partitionieren. Nun, wenn Sie sind Bedingung

WHERE ... AND IS_DELETED=0

dann Oracle wird nur scannen die Partition mit 1000 Zeilen. Wenn die Tabelle nicht partitioniert wurde, hätte es 101.000 Zeilen scannen (beide Partitionen).

, wenn die Tabelle groß ist und die Leistung ist ein Problem, können Sie immer bewegen ‚gelöscht‘ Aufzeichnungen an einem anderen Tisch, die wie die Zeit des Löschens zusätzliche Informationen haben, der den Datensatz gelöscht, usw.

auf diese Weise müssen Sie nicht eine andere Spalte zu Ihrem primären Tabelle hinzufügen

Die beste Antwort, leider, hängt davon ab, was Sie versuchen, mit Ihren Löschungen und der Datenbank, die Sie dies umsetzen erreichen innerhalb.

In SQL Server, wäre die beste Lösung zu verwenden, eine deleted_on / deleted_at Spalte mit einer Art von SMALLDATETIME oder DATETIME- (abhängig von der erforderlichen Granularität) und die Spalte auf NULL festlegbare zu machen. In SQL Server enthält die Zeilenkopfdaten einen NULL-Bit-Maske für jede der Spalten in der Tabelle, so dass es geringfügig schneller ist ein IS NULL oder IS NOT NULL durchzuführen, als es ist, den Wert in einer Spalte gespeichert zu überprüfen.

Wenn Sie eine große Menge von Daten haben, werden Sie in der Partitionierung Ihre Daten zu suchen, entweder über die Datenbank selbst oder durch zwei getrennte Tabellen (zum Beispiel Produkte und ProductHistory) oder durch eine indizierte Sicht.

Ich vermeide typischerweise Flag-Felder wie is_deleted, is_archive, etc, weil sie nur ein Stück Bedeutung tragen. Ein Nullable-deleted_at stellt archived_at Feld eine zusätzliche Bedeutungsebene zu sich selbst und zu wer erbt Ihre Anwendung. Und ich vermeiden bitmask Felder wie die Pest, da sie ein Verständnis erfordern, wie die Bit-Maske, um gebaut wurde jede Bedeutung zu erfassen.

Das hängt davon ab, welche Informationen Sie benötigen und welche Workflows Sie unterstützen möchten.

Möchten Sie in der Lage sein wollen:

  • wissen, welche Informationen gab es (bevor es gelöscht wurde)?
  • wissen, wann sie gelöscht wurde?
  • wissen, wer sie gelöscht?
  • wissen, in welcher Eigenschaft sie handeln, als sie es gelöscht?
  • der Lage sein, um den Datensatz zu un-löschen?
  • der Lage sein, zu sagen, wann es war un-deleted?
  • etc.

Wenn der Datensatz gelöscht wurde und viermal un-deleted, genügt es für Sie zu wissen, dass es zur Zeit in einer nicht gelöschten Zustand, oder wollen Sie in der Lage sein zu sagen, was in der Zwischenzeit passiert ist (einschließlich etwaiger aufeinanderfolgende Deletionen Änderungen zwischen!)?

Eine sorgfältige von Soft-gelöschte Datensätze Einzigartigkeit Einschränkungsverletzungen verursachen. Wenn Ihre DB Spalten mit eindeutigem hat dann vorsichtig sein, dass nach dem Stand der Soft-gelöschte Datensätze verhindern Sie nicht aus dem Datensatz neu zu erstellen.

Denken des Zyklus:

  1. erstellen Benutzer (login = JOE)
  2. Soft-delete (Satz gelöscht Spalte auf nicht-null).
  3. (re) erstellen Benutzer (login = JOE). ERROR. LOGIN = JOE ist bereits vergeben

Zweite führt zu einer Einschränkungsverletzung erstellen, da login = JOE bereits in der Soft-gelöschte Zeile ist.

Einige Techniken:  1. Bewegen Sie den gelöschten Datensatz in eine neue Tabelle.  2. Machen Sie Ihre Einzigartigkeit Einschränkung für die Anmeldung und deleted_at Zeitstempel Spalte

Meine eigene Meinung ist +1 für neue Tabelle zu bewegen. Sein nehmen viele     Disziplin * und delete_at = NULL * über alle zu halten Ihre     Abfragen (für alle Ihre Entwickler)

Sie werden auf jeden Fall eine bessere Leistung haben, wenn Sie Ihre gelöschten Daten an einen anderen Tisch bewegen sich wie Jim sagte, ist auch die Aufzeichnung mit der, wenn es gelöscht wurde, warum und von wem.

Hinzufügen where deleted=0 auf alle Ihre Anfragen werden sie deutlich verlangsamen und die Verwendung von einem der Indizes behindern Sie auf dem Tisch haben. Vermeiden Sie es, "Flags" in Tabellen, wann immer möglich.

Etwas, das ich an Projekten verwenden ist ein statusInd Tinyint nicht null default 0 Spalte mit statusInd als Bitmaske ermöglicht es mir (löschen, archivieren, replizieren, wiederherstellen usw.) für das Datenmanagement durchzuführen. Mit dieser in den Ansichten kann ich dann tun, um die Datenverteilung, Veröffentlichung, etc. für die nutzenden Anwendungen. Wenn die Leistung ein Problem in Bezug auf Ansichten, verwenden Sie kleine Faktentabellen, diese Informationen zu unterstützen, fällt die Tatsache, fällt die Beziehung und ermöglicht scalled Löschungen.

Waagen gut und ist datenzentrierten die Daten Fußabdruck ziemlich klein zu halten - Schlüssel für 350 GB + dbs mit Echtzeit betrifft. Mit Alternativen, Tabellen, Trigger hat einige Overhead, der je nach Bedarf kann oder auch nicht für Sie arbeiten.

SOX bezogenen Audits kann mehr als ein Feld benötigt in Ihrem Fall zu helfen, aber das kann helfen. Genießen Sie

Sie erwähnen nicht, welches Produkt, aber SQL Server 2008 und postgresql (und andere, die ich sicher bin) können Sie gefilterte Indizes erstellen, so dass Sie einen abdeckenden Index where = 0 is_deleted schaffen könnte, einige der Nachteile zu mildern dieser besondere Ansatz.

Ich ziehe eine Statusspalte zu halten, so kann ich es für mehrere verschiedene Konfigurationen verwenden, das heißt veröffentlicht, privat, gelöscht, needsAproval ...

verwenden, um eine Ansicht, Funktion oder Prozedur, die is_deleted prüft = 0, das heißt wählen Sie nicht direkt auf dem Tisch im Fall der Tabelle später ändern aus anderen Gründen benötigt

und Index der is_deleted Spalte für größere Tabellen

, da Sie bereits eine Audit-Trail haben, die Verfolgung das Löschdatums redundant

ein anderes Schema erstellen und sie alle auf Ihrem Datenschema gewähren. Implment VPD auf den neue Schema, so dass jeder und jede Abfrage wird das Prädikat hat die nicht gelöschten Zeile ermöglicht Auswahl nur angehängt. http://download.oracle.com/docs /cd/E11882_01/server.112/e16508/cmntopc.htm#CNCPT62345

@AdditionalCriteria ( "this.status <> 'gelöscht'")

setzen diese auf Ihre @Entity

http://wiki.eclipse.org/EclipseLink/Examples/JPA/SoftDelete

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top