Was ist der beste Weg, um eine Datei mit einem Datenelement zu verknüpfen?

7

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?

    
Aaron Daniels 05.03.2009, 21:45
quelle

8 Antworten

10

Ich denke, Sie haben die zwei beliebtesten Ansätze zur Lösung dieses Problems genau erfasst. Es gibt Vor- und Nachteile für jeden:

Speichern Sie die Dateien im DB

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.

Vorteile

  • Vereinfacht das Backup der Daten: Sie sichern die db Sie haben alle Dateien.
  • Die Verknüpfung zwischen den Metadaten (die anderen Spalten über die Dateien) und der Datei selbst ist solide und in die db integriert; So ist es ein One-Stop-Shop, um Daten über Ihre Dateien zu erhalten.

Nachteile

  • Backups können schnell zu einem riesigen Albtraum werden, wenn Sie alle diese binären Daten in Ihrer Datenbank speichern. Sie können einige der Kopfschmerzen lindern, indem Sie die Dateien in einer separaten Datenbank aufbewahren.
  • Ohne die Datenbank oder eine Schnittstelle zur Datenbank gibt es keine einfache Möglichkeit, den Inhalt der Datei zu ändern oder zu aktualisieren.
  • Im Allgemeinen ist es schwieriger, das Hochladen und Speichern von Daten auf einer DB im Vergleich zum Dateisystem zu programmieren und zu koordinieren.

Speichern Sie die Dateien auf dem Dateisystem

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

Vorteile

  • Hält Ihre Dateidaten sauber von der Datenbank getrennt.
  • Sie können die Dateien selbst leicht verwalten (wenn Sie die Datei ändern oder aktualisieren müssen), tun Sie dies im Dateisystem selbst. Sie können es genauso einfach von der Anwendung aus über einen neuen Upload tun.

Nachteile

  • Wenn Sie nicht vorsichtig sind, kann Ihre Datenbank über die Dateien nicht mit den Dateien selbst synchronisiert werden.
  • Sicherheit kann ein Problem sein (auch wenn Sie unvorsichtig sind), je nachdem, wo Sie die Dateien speichern und ob dieses Dateisystem für die Öffentlichkeit verfügbar ist (über das Web, das ich hier vermute).

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

    
Jay Stevens 05.03.2009, 22:00
quelle
4

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.

    
Evan 06.03.2009 01:30
quelle
2

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.

    
Kevin Laity 05.03.2009 21:50
quelle
2

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.

    
Brody 05.03.2009 21:53
quelle
2

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

    
cherouvim 05.03.2009 21:48
quelle
2

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:

  • Abfrage der Datenbank, um die Dateiinhalte in einem Blob zu speichern
  • Schreiben Sie die Blobdaten in eine Festplattendatei
  • Starten Sie eine Anwendung zum Öffnen / Bearbeiten / was immer Sie gerade erstellt haben
  • Lies die Datei von Diskette zurück in einen Blob
  • Aktualisieren Sie die Datenbank mit dem neuen Inhalt

All das im Gegensatz zu:

  • Lesen Sie den Dateipfad von der DB
  • Starten Sie die App zum Öffnen / Bearbeiten / was auch immer die Datei

Ich bevorzuge die zweite Reihe von Schritten, mich selbst.

    
Ken White 05.03.2009 21:49
quelle
1

Ich würde versuchen, alles in der Datenbank zu speichern. Hab es nicht getan. Aber wenn nicht. Es besteht ein geringes Risiko, dass Dateinamen nicht mit den Dateien auf der Festplatte synchronisiert werden. Dann hast du ein großes Problem.

    
Flinkman 05.03.2009 21:54
quelle
0

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

    
Evan 06.03.2009 01:39
quelle

Tags und Links