Sollte ich MySQL blob-Feld geben?
Ich bin kämpfen, um zu entscheiden, ob ich sollte mit der MySQL blob-Feld geben, in einem zukünftigen Projekt, das ich habe.
Meine grundlegenden Anforderungen sind, es werden bestimmte Datensätze in einer Datenbank, die eingesehen werden können und mehrere Dateien hochgeladen und "befestigt" zu diesen Aufzeichnungen. Sehen, sagte Datensätze kann begrenzt werden auf bestimmte Menschen auf einer Fall-zu-Fall-basis. Jede Art von Datei kann hochgeladen werden, die nahezu keine Einschränkung.
So sah es eine Möglichkeit, wenn ich die MySQL-Strecke, die ich nicht haben, um über sorgen virus schleichend oder random php-Dateien immer geladen und irgendwie ausgeführt. Ich habe auch einen viel einfacheren Weg für permissioning und Erhaltung der Daten gebunden, die in der Nähe eines Datensatzes.
Andere offensichtliche Weg ist die Speicherung der Daten in einem bestimmten Ordner-Struktur außerhalb des webroot-Verzeichnisses. in diesem Fall würde ich zu kommen mit einer speziellen Namenskonvention für Ordner/Dateien, um zu verfolgen, was Sie Referenz innerhalb der Datenbank.
Gibt es einen Leistungseinbruch bei der Verwendung von MySQL blob-Feld geben? Ich bin besorgt über die Wahl einer Lösung, die behindern das zukünftige Wachstum der website sowie die Auswahl einer Lösung, die nicht leicht zu pflegen.
InformationsquelleAutor Nodren | 2009-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr web-server werden für diese hochgeladenen Dateien über das web, die Leistung wird fast sicher besser sein, wenn Sie gespeichert werden, auf das Dateisystem. Der web-server wird dann in der Lage sein zu gelten, HTTP-caching Hinweise wie
Last-Modified
undETag
die helfen, die Leistung für Benutzer mit Zugriff auf die gleiche Datei mehrfach. Darüber hinaus werden die web-server automatisch die richtigeContent-Type
für die Datei, wenn Sie servieren. Wenn Sie speichern blobs in der Datenbank, werden Sie am Ende der Implementierung der oben genannten Funktionen und mehr, wenn Sie sollten Sie bekommen Sie kostenlos von Ihrem web-server.Darüber hinaus ziehen große blob-Daten aus Ihrer Datenbank kann am Ende als ein performance-Engpass auf Ihre Datenbank. Auch, Ihre Datenbank-backups wird wahrscheinlich langsamer sein, denn Sie sichern mehr Daten. Wenn Sie ad-hoc-Abfragen während der Entwicklung, es wird unbequem sein zu sehen, große blobs in der Ergebnis-sets für
select
Aussagen. Wenn Sie wollen, überprüfen Sie einfach eine Datei hochgeladen, es wird unbequem sein und Kreisverkehr zu tun, denn es werden peinliche, gespeichert in einer Datenbank-Spalte.Ich würde stick mit der gängigen Praxis der Speicherung der Dateien auf dem Dateisystem und den Pfad zu der Datei in der Datenbank.
InformationsquelleAutor Asaph
Nicht grundsätzlich, aber wenn man grosse BLOBs zu verstopfen Ihre Tabellen und Speicher-cache, der wird sicherlich Ergebnis in a performance hit.
Ja, dies ist ein gängiger Ansatz. Sie würden in der Regel etwas zu tun haben, Ordnern nach jeder Tabelle, der Sie zugeordnet sind, mit Dateinamen basieren nur auf den primären Schlüssel (idealerweise eine integer; sicherlich nie etwas user-submitted).
Ist das eine bessere Idee? Es hängt davon ab. Es gibt deployment-Einfachheit Vorteile, um mit nur einem einzigen datenspeicher, und nicht mit sorgen darum, dass der web-Benutzer Schreibrechte auf alles. Auch wenn es möglicherweise mehrere Kopien der app läuft (z.B. aktiv-aktiv load-balancing), dann müssen Sie zum synchronisieren der Speicherung, die ist viel einfacher mit einer Datenbank, als es mit einem Dateisystem.
Wenn Sie mit dem Dateisystem eher als ein blob, die Frage ist dann, erhalten Sie den web-server zu dienen, indem Sie einen Alias in den Ordner?
Content-Type
Content-Disposition: attachment
/X-Content-Type-Options
Header zu stoppen IE schnüffeln für die HTML-als Teil der anti-XSS-Maßnahmenoder dienen Sie die Datei manuell mit einem server-side script spucken es aus, als müsste man dem servieren aus einem MySQL blob?
Dies ist ein trade-off gibt nicht eine einzige Global akzeptierte Antwort.
InformationsquelleAutor bobince
Meiner Erfahrung speichern eines BLOB in MySQL ist OK, so lange Sie speichern nur den blob in einer Tabelle, während die anderen Felder werden in einer anderen (neben -) Tabelle. Umgekehrt, auf der Suche in den Feldern einer Tabelle mit ein paar standard-Felder und ein blob-Feld mit 100 MB Daten können langsame Abfragen dramatisch.
Musste ich die Daten-Schicht, eine mailing-app für dieses Problem, wo E-Mails gespeichert wurden, mit dem Inhalt in der gleichen Tabelle als Datum versendet, E-Mail-Adressen, etc. Es war die 9 Sekunden die Suche 10000 E-Mails. Jetzt dauert das, was es sollte 😉
InformationsquelleAutor Testo Testini
Daten gespeichert werden sollen, in einem konsistenten Ort: die Datenbank.
Dieser performance-und Content-Type-Ding ist nicht ein Problem überhaupt, denn es gibt nichts hindert Sie Zwischenspeichern von diesen BLOB-Felder auf den lokalen web-server und bedient ihn von dort aus, wie es beantragt wird, für die erste Zeit. Sie brauchen keine Zugriff auf die Tabelle auf jeder Seite anzuzeigen.
Diese Datei-system-cache geleert werden kann, in jedem moment, welche nur Auswirkungen auf die Leistung vorübergehend, wie es wird automatisch nachgefüllt. Es wird auch ermöglichen es Ihnen, eine Datenbank und viele web-Servern, wie Ihre Anwendung wächst, Sie werden einfach alle über einen lokalen cache auf die Datei system.
InformationsquelleAutor Sfynx
Große Mengen von Daten wird schließlich Ihren Tribut auf die Leistung. MS SQL 2008 hat eine spezielle Art der Speicherung von binären Daten in der Datei-system:
http://msdn.microsoft.com/en-us/library/cc949109.aspx
Ich würde beschäftigen ähnlichen Ansatz auch für Ihr Projekt zu.
Können Sie erstellen, DATEIEN Tabelle, die Informationen über Dateien, wie z.B. original-Namen zum Beispiel. Um sicher zu speichern Sie Dateien auf der Festplatte, benennen Sie Sie beispielsweise mit GUIDs. Speichern der neuen Datei-Namen in den DATEIEN, Tabelle und, wenn Benutzer benötigt, um es herunterladen, können Sie leicht finden es auf der Festplatte, und übertragen Sie Sie auf Benutzer.
InformationsquelleAutor LeffeBrune
Empfehlen viele Leute gegen die Speicherung von Datei-Anhänge (in der Regel gilt dies für Bilder) in blobs in der Datenbank. Stattdessen bevorzugen Sie zum speichern einen Pfadnamen als string in die Datenbank, und speichern Sie die Datei an einem sicheren Ort auf dem Dateisystem. Es gibt einige Vorteile zu dieser:
Gibt es Gegenargumente auch, dass die Unterstützung setzen Anlagen in ein blob:
So die beste Lösung hängt davon ab, wie Sie gehen, um mit den Daten in Ihrer Anwendung. Es gibt keine one-size-fits-all Antwort.
Ich weiß, Sie hat Ihre Frage mit MySQL, aber wenn Leute das Lesen dieser Frage verwenden Sie andere RDBMS, wollen Sie vielleicht Sie suchen in
BFILE
bei der Verwendung von Oracle oderFILESTREAM
wenn Sie Microsoft SQL Server 2008. Diese geben Ihnen die Möglichkeit, speichern von Dateien außerhalb der Datenbank, aber auf Sie zugreifen, wie Sie sind Teil einer Zeile in einer Datenbank-Tabelle (mehr oder weniger).InformationsquelleAutor Bill Karwin
Meiner Meinung nach die Speicherung von Dateien in der Datenbank ist eine schlechte Idee. Was können Sie speichern, es gibt id, name, Typ, ggf. md5-hash der Datei, und das Datum eingefügt. Dateien können hochgeladen werden, um Ordner außerhalb der öffentlichen Ort. Auch sollten Sie Bedenken, dass es ist nicht ratsam, halten Sie mehr als 1000 Dateien in einem Ordner. Also, was haben Sie auf neuen Ordner erstellen jedes mal, wenn die Datei-id wird erhöht um 1000.
InformationsquelleAutor Nazariy