Speichern von Bilddateien in der Mongo-Datenbank, ist das eine gute Idee?

9

Wenn Sie mit mysql arbeiten, ist es eine schlechte Idee, Bilder als BLOB in der Datenbank zu speichern, da dies die Datenbank ziemlich groß macht, was für die normale Nutzung der Datenbank schädlich ist. Dann ist es besser, Image-Dateien auf der Festplatte zu speichern und den Link zu ihnen in der Datenbank zu speichern.

Ich denke jedoch, dass dies für MongoDB anders ist, da die Erhöhung der Größe der Datenbankdatei einen vernachlässigbaren Einfluss auf die Performance hat (deshalb kann MongoDB Milliarden von Datensätzen erfolgreich verarbeiten).

Glauben Sie, dass es besser ist, Bilddateien auf MongoDB zu speichern (als GridFS), um die Anzahl der auf dem Server gespeicherten Dateien zu reduzieren; oder ist es dennoch besser, die Datenbank so klein wie möglich zu halten?

    
Googlebot 09.10.2011, 13:37
quelle

4 Antworten

11

Das Problem ist nicht so sehr, dass die Datenbank groß wird, Datenbanken können damit umgehen (obwohl MongoDB in dieser Hinsicht nicht so gut ist wie viele andere). Das Problem besteht darin, dass zum Senden der Daten an den Client zuerst von der Datenbank in den RAM verschoben werden muss, dann in den Speicher der Anwendung kopiert und dann an den Kernel übergeben werden muss, um über den Socket gesendet zu werden. Es verschwendet viel RAM und CPU-Zyklen. Der Grund, warum große Dateien im Dateisystem besser sind, ist, dass es einfacher ist, sie zu kopieren. Sie können den Kernel bitten, die Datei direkt von der Festplatte zum Socket zu streamen.

Der Nachteil beim Speichern großer Dateien im Dateisystem ist, dass es viel schwieriger zu verteilen ist. Die Verwendung einer Datenbank und so etwas wie Mongo's GridFS ermöglicht eine Skalierung. Sie müssen nur sicherstellen, dass Sie nicht die gesamte Datei gleichzeitig, sondern Stück für Stück in den Speicher der Anwendung kopieren. Die meisten Web-App-Frameworks bieten heutzutage Unterstützung für das Senden von Chunked-HTTP-Antworten.

    
Theo 09.10.2011, 17:59
quelle
5

Die Antwort ist ja. In den alten Tagen der Höhlenmenschen hatten die Server veränderbare Dateisysteme, die Sie ändern konnten. Das war großartig, bis wir versuchten, die Dinge zu skalieren.

Höhlenmenschen bauen heutzutage Apps mit unveränderlichen Bereitstellungen . Heroku und Dokku sind Beispiele dafür. Da der Webanwendungsserver über keinen Status verfügt, können sie problemlos erstellt, aktualisiert, skaliert und zerstört werden.

Da wir immer noch Dateien haben, müssen wir sie irgendwo hinstellen. Es gibt mehrere Lösungen: nfs, unsere Datenbank, jemand anderen Datenbank.

  • nfs ist ein "Netzwerk-Dateisystem", mit dem Sie Datei-I / O auf Netzwerkressourcen ausführen können. Wenn Sie sowieso mit dem Netzwerk zu tun haben, IMHO es nicht viel Wert hinzufügen, es sei denn es ist was Sie bereits wissen.

  • Unsere Datenbank - Für MongoDB gibt es zwei Optionen : (file & gt; 16mb)? GridFS: BinData

  • Jemand hat eine Datenbank - Einige sind einfach wie Amazon S3 und einige bieten zusätzliche Dienste wie Cloudinary oder Dropbox.

Wenn Sie in einem Big-Budget-Enterprise-Team sind und jemand 40 Stunden pro Woche für die Server sorgt, dann verwenden Sie das Dateisystem. Wenn Sie Web-Apps erstellen, die skalierbar sind, ist das Einfügen von Dateien in die Datenbank sinnvoll.

Wenn Sie sich Gedanken über die Leistung machen:

1) Verwenden Sie einen Proxy (z. B. nginx) oder ein CDN, um Ihren Content für Clients zu hosten. Ihr Server sollte nur Cache-Misses liefern.

2) Verwenden Sie Streaming-IO Nodeschool hat ein cooles Tutorial für Node.js .

    
Michael Cole 10.08.2015 21:42
quelle
2

MongoDBs GridFS ist für diese Art von Speicher konzipiert und eignet sich sehr gut zum Speichern von Bilddateien auf vielen verschiedenen Servern, so dass alle Server sie verwenden können.

    
ceejayoz 09.10.2011 13:56
quelle
0

Das Speichern von Bildern ist in keiner DB eine gute Idee, denn:

  
  • Lesen / Schreiben in einen DB ist immer langsamer als ein Dateisystem
  •   
  • Ihre DB-Backups werden immer größer und zeitraubender
  •   
  • Der Zugriff auf die Dateien erfordert jetzt, dass Sie Ihre App- und DB-Ebenen durchlaufen
  •   

Die letzten beiden sind die wahren Killer.

Quelle: Drei Dinge, die Sie tun sollten niemals in Ihre Datenbank eingeben .

Wenn Sie also Ihre Anwendung schlau machen können, sollten Sie Ihre Bilder besser nicht in MongoDB hochladen.

Wenn Sie jedoch kurz vor der Deadline stehen ... und die Datenbank so klein ist, dass sie nicht viel aufwächst und ihre Größe niemals den verfügbaren RAM auf dem Rechner, auf dem Ihre Anwendung läuft, übersteigt, dann denke ich (wie im Gegensatz zum Autor des zitierten Artikels), könnten Sie die Bilder in MongoDB speichern. Es ist einfach, praktisch, schnell zu implementieren und gibt Ihnen einige Flexibilität.

    
simhumileco 06.10.2017 08:43
quelle

Tags und Links