Was ist der beste Weg, um ein einfaches Revisionssystem mit MySQL erstellen?
-
10-07-2019 - |
Frage
Zur Zeit arbeite ich an einem einfachen Revisionssystem, das mich mehrere Versionen einer Datei speichern kann, was in Ordnung so weit funktioniert.
Tabellenstruktur ist als (veraltete Spalten aus Gründen der Kürze entfernt) folgt:
file_id file_revision file_parent file_name
--------------------------------------------------------
1 1 0 foo.jpg
2 2 1 foorevised.jpg
3 3 1 anotherrevision.jpg
Dabei gilt:
-
file_id
ist der Primärschlüssel, die Auto-Schritten -
file_revision
speichert die Versionsnummer1
säumigen, wenn es das erste -
file_parent
ist die oberste Ebene übergeordnete Revision, säumige wenn zuerst0
. -
file_name
ist der Dateiname.
Das Problem:
- vorzugsweise eine einzelne Abfrage ich alle Dateien abrufen möchten ...
- Aber nur die neueste Version jeder Datei ...
- ... wenn nur eine Revision gespeichert (original), soll dies ein abgerufen werden.
Alle Hinweise werden sehr geschätzt. Vielen Dank im Voraus.
Lösung
Der effizienteste Weg zum Zweck des Abrufs ist eine Spalte wie is_latest hinzufügen, die Sie im Voraus füllen müssen, dann select * from table where file_id=1 and is_latest=true
, wenn Sie die neueste Version von Datei packen wollen 1. Offensichtlich wird diese Tabelle macht Aktualisierung komplizierter jedoch.
Ein andere Möglichkeit, es zu tun wäre, um die neuesten Versionen der Dateien in einer Tabelle zu speichern, und historische Versionen in einer anderen Tabelle. Wenn Sie überwiegend auswählen möchten alle Dateien, die die neueste Version sind, könnte select * from table where is_latest=true
wahrscheinlich zu einem vollen Tisch betragen sogar scannen, wenn wenn is_latest indiziert ist. Wenn die neuesten Reihen alle die Datenbank in einer Tabelle waren, können sie alle in sequentiellen IO gelesen und haben nicht entweder 1) tun eine Menge durch den Tisch sucht nur die Datensätze zu finden, muss sie oder 2) scannen die gesamte Tabelle zu verwerfen groß Datenmengen auf dem Weg für die alten Aufzeichnungen.
Sie Angenommen, Sie möchten nicht die vorhandene Tabelle Design ändern, was Sie tun möchten, aufgerufen, um die groupwise maximale Auswahl finden Sie unter dieser Artikel für mehrere verschiedene Möglichkeiten, es in mysql zu tun.
Andere Tipps
file_id file_revised file_name Time_Stamp
-----------------------------------------------------------------
1 1 foo.jpg insert_time
2 1 foorevised.jpg insert_time
3 1 anotherrevision.jpg insert_time
Ich würde dann tun Variationen auf Abfragen wie folgt:
SELECT * WHERE file_revision = 1 ORDER BY Time_Stamp GROUP BY file_revision
oder jede beliebige Anzahl von Variation dieser Art der Abfrage, dh Grenzwert 1 oder Sortieren nach file_id als die höchsten wird hier auch die neuesten sein, etc ..