Ich muss gelöschte Elemente für die Client-Synchronisierungsanforderungen nachverfolgen.
Im Allgemeinen ist es besser, eine Tombstone-Tabelle und einen Auslöser hinzuzufügen , der nachverfolgt, wann eine Zeile aus der Serverdatenbank gelöscht wurde - im Grunde genommen, wenn der Tombstone-Tabelle eine neue Zeile mit den Daten aus dem gelöschten Element hinzugefügt wird - oder die Elemente in der Liste beizubehalten Originaltabelle und kennzeichnen sie als gelöscht, normalerweise mit einer Spalte vom Typ Bit, um anzuzeigen, dass eine Zeile gelöscht wurde und eine andere Spalte, um zu verfolgen, wann der Löschvorgang stattgefunden hat?
Vielleicht sollten Sie die beiden Methoden absichtlich kombinieren. Warum ???
Verwenden wir diese Tabelle (MySQL-Dialekt)
Bitte beachten Sie, dass mit Ausnahme des PRIMARY KEY jedem Index, den Sie erstellen, das
deleted
Flag vorangestellt werden muss und mit dem endetid
.Lassen Sie uns die Tombstone-Tabelle erstellen
Wenn Ihre Tabelle bereits ein
deleted
Flag enthält, können Sie die Tommy-Stone-Tabelle füllenOK, jetzt sind die Daten und der Tombstone vorbereitet. Wie führen Sie Löschvorgänge durch?
Angenommen, Sie löschen jede Person in der Postleitzahl 07305. Sie würden Folgendes ausführen:
OK, das scheint so oder so viel Aufwand zu bedeuten.
Möchten Sie jetzt alle gelöschten Daten sehen? Hier sind zwei verschiedene Möglichkeiten:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Wenn die Anzahl der IDs in mytomb mehr als 5% der Zeilenanzahl von mydata beträgt, handelt es sich um einen vollständigen Tabellenscan. Andernfalls wird ein Index-Scan mit einer Suche für jede Zeile durchgeführt. Beachten Sie alle Benchmarks in dieser Hinsicht. Schauen Sie sich die EXPLAIN-Pläne an.
Möchten Sie jetzt jede Person in Postleitzahl 07304 sehen? Hier sind zwei verschiedene Möglichkeiten:
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
Wie wäre es mit Massenlöschungen? Hier sind zwei verschiedene Möglichkeiten:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
FAZIT
Jetzt sage ich nicht, beide Methoden beizubehalten. Dies im Laufe der Zeit zu tun, zeigt, welche Methode in Bezug auf die allgemeine Bedienbarkeit schneller ist. Sie müssen entscheiden, welche Benchmarks für die Abfrage von Live-Daten, die Abfrage gelöschter Daten und die Massenlöschung am besten für Sie geeignet sind.
quelle