2013-03-24 17 views
7

Ich benutze mongodb und möchte einige Thumbnails in meinem Server speichern. Was ist das Beste? Verwenden Sie GridFS oder konvertieren Sie diese Bilder nach base64 und speichern Sie sie direkt in einem Dokument.Mongodb base64 image vs gridfs

+0

Wie ist die endgültige Größe in K? GridFs wird nicht aufgeteilt, bis die Datei über 256k liegt. Werden Sie die endgültige Datei als Binärdatei oder base64 verwenden? – WiredPrairie

Antwort

0

Ich empfehle Ihnen, GridFS zu verwenden. Mit GridFS können Sie den Vorteil von MongoDB REST API nutzen. Es wird also keine Überhitzung geben, um Dokumente mit der MongoDB API abzurufen. REST API wird die ganze harte Arbeit erledigen und Ihnen Zeit sparen.

3

Es hängt wirklich von Ihrer Server-Seite Technologie und persönlichen Vorlieben ab. 10gen schlägt vor, dass Sie Dokumente verwenden, es sei denn, Sie speichern Dateien, die größer als das Dokumentenlimit (16 MB) sind. Ich würde vorschlagen, dass Sie das tun, was Ihnen in der Sprache, mit der Sie arbeiten, leichter fällt. Wenn Sie nach dem Dokument andere Dokumente zu modellieren haben, geben Sie ansonsten gridFS eine Aufnahme.

3

Wie immer gibt es einige (dis) Vorteile:

Pro:

  • Weniger Datenbank-Anfragen, wenn nur das Dokument + Thumbnail benötigt wird.
  • Weniger Clientanforderungen. (Natürlich können Sie die Thumbnails von GridFS holen, und legen sie in der Antwort, aber das in mehr Datenbank-Anfragen führen würde)

Neutral:

  • Lagerbedingungen gleich sind

Nachteile:

  • Sie können die Miniatur des Miniaturbildes nicht einfach in einem anderen Dokument wiederverwenden, da keine ID vorhanden ist, auf die verwiesen werden kann. (Für uns, das ist kein Problem, weil die Server-Antworten komprimiert sind gzip und man kann wirklich den Unterschied zwischen 1 und 5 gleich Bilder nicht sagen)

Mit MongoDB und NoSQL es geht um Ihre Anwendungsfälle zu wissen !

  • Wenn viel von Ihrer Dokumente das gleiche Bild teilen, sollten Sie GridFS verwenden und nur auf diese Dateien Links bieten, weil 1. gemeinsamen Nutzung von Daten platzsparender und 2. der Client-Cache kann, ist die Bildanforderung und muss sie nur einmal abrufen.

  • Wenn Ihre Clients immer das Thumbnail benötigen, sollten Sie in Erwägung ziehen, die Dateien als base64 in die Antwort einzubetten. Dies ist besonders schön, wenn 1. Bilder nicht zwischen Dokumenten geteilt werden und/oder 2. Bilder oft ändern und Caching ist nutzlos/nicht möglich.

  • Base64 bedeutet natürlich mehr Verkehr auf der Leitung, weil es 8 Bits benötigt, um 6 Bits zu übertragen. d.h. 75% Effizienz. Dies betrifft natürlich nur die Client-Server-Kommunikation, da Sie Ihre Daten in MongoDB immer als Binärfeld speichern können.

  • Bevorzugen Sie mehr Datenbankanforderungen (= mit GridFS)? Oder größere Daten/Dokumentgröße auf dem Draht (= eingebettet)?

Was wir getan haben:

Wir Miniaturinformationen verwenden, auch wenn wir möglicherweise doppelte Bilder haben. Nach der Aktivierung der gzip-Komprimierung auf dem Server spielte die Größe der Server-Client-Übertragung keine Rolle mehr. Aber wie gesagt, es ist ein Kompromiss: Jetzt haben wir weniger Client-Anfragen und weniger Datenbank-Anfragen, aber weil die Einbettung das Zwischenspeichern der Bilder unmöglich macht, haben wir jetzt mehr Daten auf dem Draht.

Fazit:

Es gibt keine Einheitsgröße Lösung passt.