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 Versionsnummer 1 säumigen, wenn es das erste
  • file_parent ist die oberste Ebene übergeordnete Revision, säumige wenn zuerst 0.
  • 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.

War es hilfreich?

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 ..

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