Ich habe eine Anwendung, die Datensätze in einer Tabelle erstellt (Raketenwissenschaft, ich weiß). Benutzer möchten Dateien (.doc, .xls, .pdf usw.) einem einzelnen Datensatz in der Tabelle zuordnen.
Soll ich den Inhalt der. speichern? Datei (en) in der Datenbank? Wäre das nicht? aufgeblasen die Datenbank?
Soll ich die Datei (en) in einer Datei speichern? Server, und speichern Sie den / die Pfad (e) in der Datenbank?
Was ist der beste Weg, dies zu tun?
Ich denke, Sie haben die zwei beliebtesten Ansätze zur Lösung dieses Problems genau erfasst. Es gibt Vor- und Nachteile für jeden:
Die meisten rbms unterstützen das Speichern von Blobs (oder binären Dateidaten, .doc, .xls usw.) in einer db. Sie gehen hier also keine neuen Wege.
Dieser Ansatz ist ziemlich einfach, Sie speichern die Dateien selbst im Dateisystem. Ihre Datenbank speichert einen Verweis auf den Speicherort der Datei (sowie alle Metadaten zu der Datei). Ein hilfreicher Hinweis hier ist, Ihr Benennungsschema für die Dateien auf der Festplatte zu standardisieren (verwenden Sie nicht die Datei, die der Benutzer Ihnen gibt, erstellen Sie eine eigene und speichern Sie sie in der Datenbank).
Am Ende des Tages entschieden wir uns für die Dateisystemroute. Es war einfacher, schnell und einfach das Backup zu implementieren, ziemlich sicher, nachdem wir alle Lücken geschlossen und die Datei gestreamt hatten (anstatt sie direkt aus dem Dateisystem zu bedienen). Es ist seit etwa 6 Jahren in zwei verschiedenen Regierungsanwendungen in praktisch demselben Format in Betrieb.
J
Wie gut Sie Binärdateien oder BLOBs in einer Datenbank speichern können, hängt stark von dem verwendeten DBMS ab.
Wenn Sie Binärdateien im Dateisystem speichern, müssen Sie überlegen, was bei einer Dateinamen-Kollision passiert, wenn Sie versuchen, zwei verschiedene Dateien mit demselben Namen zu speichern und zu speichern - und ob dies eine gültige Operation ist oder nicht. Zusammen mit dem Verweis auf den Speicherort der Datei im Dateisystem müssen Sie möglicherweise auch den ursprünglichen Dateinamen speichern.
Wenn Sie eine große Anzahl von Dateien speichern, sollten Sie auch auf mögliche Leistungseinbußen beim Speichern aller Dateien in einem Ordner achten. (Sie haben Ihr Betriebssystem nicht angegeben, aber Sie sollten sich vielleicht diese Frage für NTFS, oder diese Referenz für ext3.
>Wir hatten ein System, das mehrere tausend Dateien im Dateisystem speichern musste, in einem Dateisystem, in dem wir uns Gedanken über die Anzahl der Dateien in einem Ordner machten (es könnte FAT32 gewesen sein, glaube ich).
Unser System würde eine neue Datei hinzufügen und eine MD5-Prüfsumme dafür erzeugen (in hex). Es würde die ersten zwei Zeichen und machen, dass der erste Ordner, die nächsten zwei Zeichen und machen, dass der zweite Ordner als Unterordner des ersten Ordners, und dann die nächsten beiden als dritter Ordner als Unterordner der zweiter Ordner.
Auf diese Weise hatten wir einen dreistufigen Satz von Ordnern, und die Dateien waren ziemlich gut verteilt, so dass sich kein Ordner zu sehr füllte.
Wenn wir noch danach eine Dateinamen-Kollision hatten, würden wir einfach "_ n " zum Dateinamen (vor der Erweiterung) hinzufügen, wobei n war nur eine inkrementierende Zahl, bis wir einen Namen bekamen, der nicht existierte (und selbst dann, glaube ich, haben wir die atomare Dateierstellung gemacht, nur um sicher zu sein).
Natürlich brauchen Sie dann Tools, um gelegentlich die Datenbankeinträge mit dem Dateisystem zu vergleichen, fehlende Dateien zu markieren und verwaiste Dateien zu bereinigen, in denen der Datenbankeintrag nicht mehr existiert.
Sie sollten nur Dateien in der Datenbank speichern, wenn Sie ziemlich sicher sind, dass Sie wissen, dass die Größe dieser Dateien nicht außer Kontrolle geraten wird.
Ich verwende unsere Datenbank, um kleine Bannerbilder zu speichern, von denen ich immer weiß, welche Größe sie haben werden. Ihre Datenbank speichert einen Zeiger auf die Daten in einer Zeile und dann die Daten selbst woanders, so dass die Geschwindigkeit nicht unbedingt beeinträchtigt wird.
Wenn es zu viele Unbekannte gibt, ist die Verwendung des Dateisystems die sicherere Route.
Die beste Lösung wäre, die Dokumente in die Datenbank zu legen. Dies vereinfacht das Verknüpfen und Sichern und Wiederherstellen von Problemen - aber es löst nicht die grundlegende "Wir wollen nur auf Dokumente auf unserem Dateiserver hinweisen", die die Benutzer möglicherweise haben.
Am Ende hängt alles von den tatsächlichen Benutzeranforderungen ab.
Meine Empfehlung wäre, alles in der Datenbank zusammenzufassen, damit Sie die Kontrolle darüber behalten. Wenn man sie im Dateisystem belässt, bleiben sie offen für das Löschen, Verschieben, ACL'd oder jede von Hunderten von anderen Änderungen, die die Verknüpfung mit ihnen sinnlos oder sogar schädlich machen könnten.
Das Aufblähen der Datenbank ist nur dann ein Problem, wenn Sie keine Größenbeschränkung haben. Machen Sie einige Tests und sehen Sie, welche Auswirkungen es hat. 100 GB Dateien auf einer Festplatte sind wahrscheinlich genauso groß wie die gleichen Dateien in einer Datenbank.
Verwenden Sie die Datenbank für Daten und das Dateisystem für Dateien. Speichern Sie den Dateipfad einfach in der Datenbank.
Außerdem kann Ihr Webserver Dateien möglicherweise effizienter bereitstellen als der Anwendungscode (um die Datei von der DB zurück zum Client zu streamen).
Speichern Sie die Pfade in der Datenbank. Dadurch wird Ihre Datenbank vor Blooming geschützt und Sie können die externen Dateien separat sichern. Sie können sie auch leichter verschieben; Verschieben Sie sie einfach an einen neuen Ort und aktualisieren Sie dann die Datenbank.
Eine weitere Sache, die Sie beachten sollten: Um die meisten der genannten Dateitypen zu verwenden, müssen Sie:
All das im Gegensatz zu:
Ich bevorzuge die zweite Reihe von Schritten, mich selbst.
Und jetzt zu dem Vorschlag, den Sie komplett von der Wand ablegen - Sie könnten die Binärdateien als Anhänge in CouchDB Dokumentendatenbank. Dies würde die Probleme mit der Dateinamen-Kollision vermeiden, da Sie eine generierte UID als jede Dokument-ID verwenden würden (was Sie in Ihrem RDBMS speichern würden), und der Dateiname der tatsächlichen Anlage wird im Dokument beibehalten.
Wenn Sie ein webbasiertes System aufbauen, könnte die Tatsache, dass CouchDB REST über HTTP verwendet, auch genutzt werden. Und es gibt auch Replikationsmöglichkeiten, die sich als nützlich erweisen könnten.
Natürlich ist CouchDB noch in der Inkubation, obwohl es einige gibt, die es bereits "in freier Wildbahn" benutzen. .