私にとってblobの問題の1つは、Javaでは、ByteBuffer(cassandraのblobにマップされている)がシリアライズ可能ではないため、EJBではうまく機能しないことです。
Jsonがかなり大きいことを考えると、jsonをcassandraに格納するのに適したタイプは何でしょうか。それはテキストまたはブロブですか?
Blobとjsonを決定するときに、jsonのサイズは重要ですか?
Oracleのような他のデータベースの場合は、blob/clobを使用するのが一般的です。しかし、Cassandraでは、各セルが最大2GBを保持できる場所で、それは重要ですか?
この質問は、jsonに単一の列を使用するかどうかに関する提案に並べ替えるのではなく、この場合のテキストとblobのどちらを選択するかを検討してください。
CassandraでliteralJSONデータをBLOB
として保存することには何のメリットもないと思います。せいぜいあなたのストレージコストは同一であり、一般にAPIは文字列/テキストを操作するためのものであるので、BLOB
タイプを操作することに関してはあまり便利ではありません。
たとえば、 Java API を使用している場合、パラメータ化されたBLOB
を使用してデータをPreparedStatement
として保存するには、最初にすべてをロードする必要がありますByteBuffer
、たとえば、JSONデータをInputStream
にパックする。
とにかくデータをストリーミングするよう強制する非常に大きなJSONスニペットを扱っていない限り、BLOB
タイプにアクセスするにはかなりの追加作業が必要です。 。そして、あなたはそれから何を得るでしょうか?本質的には何もありません。
ただし、「JSONをテキストとして保存するか、gzipして圧縮データをBLOB
? '。
その答えは、Cassandraとテーブルの構成方法にあります。特に、Cassandraバージョン1.1または後でテーブルのデフォルトで圧縮が有効になります。特に、JSONデータが各行でかなり均一である場合は、これで十分です。
ただし、Cassandraの組み込み圧縮は、個々の行ではなく、テーブル全体に適用されます。したがって、保存する前にJSONデータを手動で圧縮し、圧縮されたバイトをByteBuffer
に書き込んでから、データをCassandraとしてBLOB
。
したがって、本質的には、ストレージスペースとプログラミングの利便性とCPU使用率のトレードオフになります。私は問題を次のように決定します:
BLOB
として保存します。BLOB
として保存します。BLOB
として保存します。データはバイナリではないため、バイナリラージオブジェクトを使用する理由はほとんどありません。もちろんできますが、なぜですか?テキストは人間にとって読みやすく、速度/サイズの違いはありません(。
他のDBでも、JSONをテキストとして保存できることがよくあります。例えば。 MySQLにも、かなりの量のテキストを処理できるテキストフィールドがあります(LONGTEXT = 4Gb)。ええ、オラクルは遅れていますが、うまくいけば、彼らは時々妥当な長いテキストフィールドを取得するでしょう。
しかし、なぜJsonオブジェクト全体をテキストとして保存したいのですか? jsonは実際には正規化され、DB内の複数のフィールドとして格納されている必要があります。
JSONを格納するには、テキストがblobよりも優れていると私は間違いなく言います。 JSONは最終的にテキストであるため、このタイプは理にかなっていますが、一部のドライバーでは、挿入する前に16進数に変換する必要があるため、blobに余分なオーバーヘッドが生じる場合があります。また、cqlshを使用すると、blobはbase64でエンコードされた文字列として表示されるため、テストのために必要な場合、実際に格納されているJSONを簡単に確認することはできません。 blobがディスクにどのように格納されるかは正確にはわかりませんが、テキストと同じように見えると思います。
そうは言っても、大きなエントリを保存すると問題が発生する可能性があり、 推奨されません になります。これにより、シャーディングで問題が発生し、大量のメモリを消費する可能性があります。 FAQは64MBを超えるファイルを指しますが、経験上、平均でそれぞれ数メガバイトのファイルであっても、大量のファイルの保存を開始するとパフォーマンスの問題が発生する可能性があります。可能であれば、 JSONのサイズがメガバイトになることが予想される場合はオブジェクトストアを使用し、代わりにそのストアへの参照をCassandraに保存します。