webentwicklung-frage-antwort-db.com.de

Was sind die Vor- oder Nachteile des Speicherns von JSON als Text vs BLOB in Cassandra?

Ein Problem mit Blob ist für mich, dass in Java ByteBuffer (der auf Blob in Cassandra abgebildet ist) nicht serialisierbar ist und daher nicht gut mit EJBs funktioniert.

Wenn man bedenkt, dass der JSON ziemlich groß ist, was wäre der bessere Typ, um JSON in Cassandra zu speichern. Ist es Text oder Klecks?

Ist die Größe des JSON wichtig, wenn es um die Entscheidung zwischen BLOB und JSON geht?

Wenn es sich um eine andere Datenbank wie Oracle handelte, ist die Verwendung von blob/clob üblich. Aber in Cassandra, wo jede Zelle bis zu 2 GB aufnehmen kann, spielt es eine Rolle?

Bitte betrachten Sie diese Frage als die Wahl zwischen Text und Blob für diesen Fall, anstatt nach Vorschlägen zu sortieren, ob für JSON nur eine Spalte verwendet werden soll.

12
pinkpanther

Ich glaube nicht, dass es von Vorteil ist, die literalen JSON-Daten als BLOB in Cassandra zu speichern. Bestenfalls sind Ihre Speicherkosten identisch, und im Allgemeinen sind die APIs für die Arbeit mit BLOB -Typen weniger geeignet als für die Arbeit mit Zeichenfolgen/Text.

Wenn Sie beispielsweise Java API verwenden, müssen Sie die Daten zuerst laden, um sie als BLOB mit Hilfe einer parametrisierten PreparedStatement zu speichern Alles in eine ByteBuffer, zum Beispiel indem Sie Ihre JSON-Daten in eine InputStream packen.

Wenn Sie es nicht mit sehr großen JSON-Snippets zu tun haben, die Sie sowieso zum Streamen Ihrer Daten zwingen, ist dies eine Menge zusätzlicher Arbeit, um auf den Typ BLOB zuzugreifen. Und was würden Sie davon profitieren? Im Grunde nichts.

Ich denke jedoch, dass es ein Verdienst ist, nach 'Sollte ich JSON als Text speichern oder gzipen und die komprimierten Daten als BLOB speichern?' zu fragen.

Und die Antwort darauf hängt davon ab, wie Sie Cassandra und Ihre Tabelle konfiguriert haben. Insbesondere, solange Sie Cassandra Version 1.1 oder In späteren Tabellen ist die Komprimierung standardmäßig aktiviert. Dies ist möglicherweise ausreichend, insbesondere wenn Ihre JSON-Daten in jeder Zeile ziemlich einheitlich sind.

Die in Cassandra integrierte Komprimierung wird jedoch tabellenweit und nicht auf einzelne Zeilen angewendet. Sie können also ein besseres Komprimierungsverhältnis erzielen, indem Sie Ihre JSON-Daten vor dem Speichern manuell komprimieren, die komprimierten Bytes in eine ByteBuffer schreiben und die Daten dann in Cassandra als BLOB.

Es kommt also im Wesentlichen auf einen Kompromiss zwischen Speicherplatz und Programmierkomfort und CPU-Auslastung an. Ich würde die Angelegenheit wie folgt entscheiden:

  1. Ist das Minimieren des verbrauchten Speicherplatzes Ihr größtes Problem?
    • Wenn ja, komprimieren Sie die JSON-Daten und speichern Sie die komprimierten Bytes als BLOB;
    • Fahren Sie andernfalls mit Schritt 2 fort.
  2. Ist Cassandras integrierte Komprimierung verfügbar und für Ihren Tisch aktiviert?
    • Wenn nein (und wenn Sie die Komprimierung nicht aktivieren können), komprimieren Sie die JSON-Daten und speichern Sie die komprimierten Bytes als BLOB;
    • Andernfalls fahren Sie mit Schritt 3 fort.
  3. Sind die zu speichernden Daten in jeder Zeile relativ einheitlich?
    • Wahrscheinlich lautet die Antwort für JSON-Daten "Ja". In diesem Fall sollten Sie die Daten als Text speichern und Cassandra für die Komprimierung sorgen;
    • Fahren Sie andernfalls mit Schritt 4 fort.
  4. Möchten Sie Effizienz oder Bequemlichkeit?
    • Effizienz; Komprimieren Sie die JSON-Daten und speichern Sie die komprimierten Bytes als BLOB.
    • Bequemlichkeit; Komprimieren Sie die JSON-Daten, base64 die komprimierten Daten und speichern Sie die base64-codierten Daten als Text.
16
aroth

Da die Daten nicht binär sind, gibt es wirklich keinen Grund, ein binäres großes Objekt zu verwenden. Sicher kannst du es, aber warum? Text ist für Menschen einfacher zu lesen und es gibt keinen Geschwindigkeits-/Größenunterschied (. 

Selbst in anderen DBs können Sie JSON häufig als Text speichern. Z.B. Sogar MySQL hat Textfelder, die ziemlich wenig Text verarbeiten können (LONGTEXT = 4 GB). Ja, Oracle ist zurück, aber hoffentlich bekommen sie manchmal auch ein langes Textfeld.

Aber warum möchten Sie ein ganzes Json-Objekt als Text speichern? Der Json sollte wirklich normalisiert und als mehrere Felder in der DB gespeichert werden. 

0
Astrogat

Ich würde definitiv sagen, dass Text für das Speichern von JSON besser ist als ein Fleck. JSON ist letztlich Text. Daher ist dieser Typ sinnvoll. Es kann jedoch auch zu Mehraufwand für Blobs kommen, da einige Treiber anscheinend vor dem Einfügen in Hex konvertieren müssen. Außerdem werden Blobs bei Verwendung von cqlsh als Base64-codierte Zeichenfolgen angezeigt. Sie können also nicht einfach überprüfen, welche JSON-Daten tatsächlich gespeichert wurden, wenn Sie es zu Testzwecken benötigen. Ich weiß nicht genau, wie Blobs auf der Festplatte gespeichert werden, aber ich kann mir vorstellen, dass es dem Text sehr ähnlich ist.

Das Speichern großer Einträge kann jedoch zu Problemen führen und wird nicht empfohlen . Dies kann zu Problemen mit dem Sharding führen und viel Speicherplatz verbrauchen. Obwohl sich FAQ auf Dateien mit mehr als 64 MB bezieht, können selbst Dateien, die jeweils einige MB groß sind, im Durchschnitt zu Leistungsproblemen führen, wenn Sie mit dem Speichern einer großen Anzahl von ihnen beginnen. Wenn möglich, empfiehlt es sich, einen Objektspeicher zu verwenden, wenn Sie davon ausgehen, dass der JSON eine Größe in Megabyte hat und stattdessen Verweise auf diesen Speicher in Cassandra speichert.

0
Jonathan