Ich arbeite an einer Software, die Dateien in einem Dateisystem speichert, sowie Verweise auf diese Dateien in einer Datenbank. Das Abfragen der hochgeladenen Dateien kann somit in der Datenbank erfolgen, ohne auf das Dateisystem zugreifen zu müssen. Nach dem, was ich in anderen Beiträgen gelesen habe, sagen die meisten Leute, dass es besser ist, ein Dateisystem für die Dateispeicherung zu verwenden, anstatt Binärdaten direkt in einer Datenbank als BLOB zu speichern.Halten Sie meine Datenbank und Dateisystem synchron
Also jetzt versuche ich zu verstehen, die beste Möglichkeit, dies einzurichten, so dass sowohl die Datenbank ein Dateisystem synchron bleiben und ich nicht mit Verweisen auf Dateien, die nicht existieren, oder Dateien zu beenden Speicherplatz im Dateisystem, die nicht referenziert sind. Hier sind ein paar Optionen, die ich in Betracht ziehe.
Option 1: Datei hinzufügen Referenz Erste
//Adds a reference to a file in the database
database.AddFileRef("newfile.txt");
//Stores the file in the file system
fileStorage.SaveFile("newfile.txt",dataStream);
Diese Option problematisch wäre, da der Verweis auf die Datei vor der eigentlichen Datei hinzugefügt wird, so kann ein anderer Benutzer eine Datei zum Download am Ende versucht, vor Es ist tatsächlich im System gespeichert. Obwohl der Verweis auf die Datei vor der Hand erstellt wird, kann der Primärschlüsselwert beim Speichern der Datei verwendet werden.
Option 2: Shop erste Datei
//Stores the file
fileStorage.SaveFile("newfile.txt",dataStream);
//Adds a reference to the file in the database
//fails if reference file does not existing in file system
database.AddFileRef("newfile.txt");
Diese Option ist besser, aber wäre es möglich, dass jemand eine Datei in das System zu laden, die nie referenziert wird. Dies könnte jedoch mit einer "Purge" - oder "CleanUpFileSystem" -Funktion behoben werden, die nicht referenzierte Dateien löscht. Diese Option würde auch nicht zulassen, dass die Datei mit dem Primärschlüsselwert aus der Datenbank gespeichert wird.
Option 3: Pending-Status
//Adds a pending file reference to database
//pending files would be ignored by others
database.AddFileRef("newfile.txt");
//Stores the file, fails if there is no
//matching pending file reference in the database
fileStorage.SaveFile("newfile.txt",dataStream); database
//marks the file reference as committed after file is uploaded
database.CommitFileRef("newfile.txt");
Mit dieser Option kann der Primärschlüssel erstellt werden, bevor die Datei hochgeladen wird, sondern verhindert auch andere Benutzer einen Verweis auf eine Datei zu erhalten, bevor es hochgeladen wird. Es wäre jedoch möglich, dass eine Datei niemals hochgeladen wird und ein Dateiverweis aussteht. Es wäre jedoch auch ziemlich einfach, ausstehende Verweise aus der Datenbank zu entfernen.
Ich neige zu Option 2, weil es einfach ist, und ich muss mich nicht darum kümmern, dass Benutzer versuchen, Dateien anzufordern, bevor sie hochgeladen werden. Speicher ist billig, also ist es nicht das Ende der Welt, wenn ich am Ende einige nicht referenzierte Dateien benötige. Aber das scheint auch ein allgemeines Problem zu sein, und ich würde gerne hören, wie andere es gelöst haben oder andere Überlegungen, die ich treffen sollte.
Sehr intelligente Frage. Viele Menschen denken nie über Konsistenz zwischen ihren unterschiedlichen Datenspeicher nach. – usr