2 Stimmen

Wie kann man Daten in einem Verzeichnis mit einer Datenbank synchronisieren?

In meiner Situation geht es um ein Verzeichnis, das MP3-Dateien enthält, und eine Datenbank, die alle MP3-Metadaten (d. h. Genres, Künstlernamen, Albumnamen und Titelnamen) der MP3-Dateien in diesem Verzeichnis enthalten soll. Die Datenbank sollte immer den Inhalt des Verzeichnisses widerspiegeln, d. h. der Algorithmus, nach dem ich suche, sollte niemals Objekte aus dem Verzeichnis löschen, sondern nur aus der Datenbank. Das Verzeichnis ist das Original, die Datenbank sollte die exakte Kopie des Verzeichnisses sein, nachdem das Programm ausgeführt wurde, und das Verzeichnis sollte vom Programm unberührt bleiben.

Nach meinem Verständnis müsste ich den Inhalt des Verzeichnisses in einer Schleife durchgehen und Datensätze in die Datenbank einfügen, wenn ich auf MP3-Metadaten stoße, die im Verzeichnis, aber nicht in der Datenbank zu finden sind. Dann muss ich eine Schleife über den Inhalt der Datenbank laufen lassen und die nicht im Verzeichnis gefundenen Daten aus der Datenbank löschen.

Gibt es einen allgemeinen Algorithmus für die Synchronisierung von zwei Dingen, z. B. einem Verzeichnis und einer Datenbank? Gibt es einen besseren Weg, als den, den ich skizziert habe?

Ich versuche, diese Aufgabe mit Ruby Sequel und MySQL zu erledigen, falls das eine Rolle spielt.

Nur zur Klarstellung: Gehen Sie davon aus, dass alle MP3-Tag-Daten korrekt sind. Ich lasse alle Dateien durch einen automatischen MP3-Tagger laufen und stelle sicher, dass alles korrekt getaggt ist, bevor ich es in dieses Verzeichnis verschiebe.

Ich würde es vorziehen, ein Ruby-Skript manuell auszuführen, anstatt z. B. mit Cron. Meine Gründe dafür sind, weil es die Sprache ist, die ich bereits verwende, um den größten Teil dieses Projekts zu implementieren, und ich muss alle MP3-Dateien manuell taggen und überprüfen, ob sie korrekt sind, also möchte ich nicht, dass irgendwelche Skripte ausgeführt werden, bis ich überprüfen kann, dass alle Dateien in meinem MP3-Verzeichnis gut zu gehen.

0voto

webguydan Punkte 400

Sie könnten dies wahrscheinlich mit 2 Cron-Skripten erledigen.

Das erste Skript könnte das Verzeichnis durchsuchen und nach Dateien suchen, deren Änderungsdatum größer ist als das letzte Mal, als die Überprüfung durchgeführt wurde (oder basierend auf dem neuesten Eintrag in der DB). Wenn eine neue Datei gefunden wird, könnte das Skript eine Einfügung vornehmen.

Sie können die ID3-Tags der MP3-Dateien lesen, um die meisten der gesuchten Metadaten zu erhalten, obwohl dies voraussetzt, dass alle Ihre Dateien diese Daten enthalten. Sie müssen Ausweichmechanismen für den Fall in Betracht ziehen, dass die Daten fehlen, z. B. die Verwendung des Dateinamens.

Das Löschskript könnte auch in umgekehrter Richtung funktionieren. Sie müssen ein Feld in der Datenbank anlegen, das den relativen Pfad zur Datei im Verzeichnis enthält. Sie können dann in einer Schleife durch die Datenbankeinträge gehen und prüfen, ob jede Datei existiert. Wenn eine Datei nicht gefunden wird, können Sie die ID zu einer Liste hinzufügen. Nach der Überprüfung können Sie die Löschanweisung für die erfassten IDs ausführen.

0voto

Precipitous Punkte 5103

Was die allgemeinen Strategien betrifft,

webguydan In der Strategie der Firma wird ein Skript verwendet, das in einer Schleife Datei- und Datenbankeinträge vergleicht, und zwar vorwärts und rückwärts. Sie können es besser machen, wenn Sie Ihre Datenbank stärker nutzen.

Beachten Sie, was hier langsam sein wird und was nicht: Datenbankeinfügungen sind die schnellste Datenbankoperation. Die langsamste Operation wird wahrscheinlich das Lesen von MP3-Metadaten aus dem Dateisystem sein. Einzelne Aufrufe an das Dateisystem oder an die Datenbank sind viel teurer als Set-Operationen (Abrufen einer Liste von Dateien). Insbesondere der Löschvorgang, bei dem Hunderte von Zeilen auf das Vorhandensein einer Datei überprüft werden, ist sehr langsam.

Strategie 2. Erstellen einer Staging-Tabelle in der Datenbank, um Vergleiche durchzuführen. Ihr Skript liest alle mp3s und fügt sie in eine Staging-Tabelle ein, die eine leere Kopie der mp3-Tabelle ist. Anschließend stellen Sie eine Verknüpfung mit der echten Tabelle her, um Verschiebungen, Löschungen und Hinzufügungen zu erkennen.

Strategie 3: Ersetzen Sie einfach die gesamte Datenbanktabelle. Ich vermute, dass der langsame Teil dieses Vorgangs das Lesen der mp3-Metadaten sein wird, nicht irgendeine Datenbankoperation. Da Ihr Prozess ohnehin alle mp3-Metadaten liest, um Änderungen zu erkennen, ersetzen Sie einfach die gesamte SQL-Datenbank bei jeder Aktualisierung.

Ich würde mit diesem Ansatz beginnen und ihn bei Bedarf optimieren. Das Ersetzen wird nicht funktionieren, wenn Sie zusätzliche Informationen in der mp3-SQL-Datenbank gespeichert haben, die Sie nicht aus dem Dateisystem ersetzen konnten.

Strategie 4: Je nach Betriebssystemversion kann das Extrahieren von mp3-Metadaten langsam sein (oder vielleicht auch nicht?) Überspringen Sie das Lesen langsamer Teile des Dateisystems (Metadaten?), indem Sie Pfad, Name und Aktualisierungsdatum in Ihre Staging-Tabelle lesen. Einfache SQL-Abfragen können Dateien identifizieren, die aktualisiert (mp3-Daten lesen), aus der Tabelle gelöscht oder eingefügt werden müssen.

Andere Ansätze: Beachten Sie, dass viele Betriebssysteme und Produkte bereits datenbankähnliche Abfragen auf die Daten, über die Sie sprechen, ermöglichen. MS Indexing Service, zum Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X