web-dev-qa-db-ja.com

jsonをテキストとして、またはcassandraのblobとして保存することの長所と短所は何ですか?

私にとってblobの問題の1つは、Javaでは、ByteBuffer(cassandraのblobにマップされている)がシリアライズ可能ではないため、EJBではうまく機能しないことです。

Jsonがかなり大きいことを考えると、jsonをcassandraに格納するのに適したタイプは何でしょうか。それはテキストまたはブロブですか?

Blobとjsonを決定するときに、jsonのサイズは重要ですか?

Oracleのような他のデータベースの場合は、blob/clobを使用するのが一般的です。しかし、Cassandraでは、各セルが最大2GBを保持できる場所で、それは重要ですか?

この質問は、jsonに単一の列を使用するかどうかに関する提案に並べ替えるのではなく、この場合のテキストとblobのどちらを選択するかを検討してください。

15
pinkpanther

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使用率のトレードオフになります。私は問題を次のように決定します:

  1. biggestの懸念を消費するストレージの量を最小限にしていますか?
    • はいの場合、JSONデータを圧縮し、圧縮されたバイトをBLOBとして保存します。
    • それ以外の場合は、#2に進みます。
  2. Cassandraの組み込みの圧縮は使用可能であり、テーブルで有効になっていますか?
    • いいえの場合(および圧縮を有効にできない場合)、JSONデータを圧縮し、圧縮されたバイトをBLOBとして保存します。
    • それ以外の場合は、#3に進みます。
  3. 格納するデータは、各行で比較的均一ですか?
    • おそらくJSONデータの場合、答えは「はい」です。その場合、データをテキストとして保存し、Cassandraで圧縮を処理する必要があります。
    • それ以外の場合は#4に進みます。
  4. 効率性と利便性のどちらが必要ですか?
    • 効率; JSONデータを圧縮し、圧縮されたバイトをBLOBとして保存します。
    • 便利; JSONデータを圧縮し、base64で圧縮したデータをbase64でエンコードしたデータをテキストとして保存します。
16
aroth

データはバイナリではないため、バイナリラージオブジェクトを使用する理由はほとんどありません。もちろんできますが、なぜですか?テキストは人間にとって読みやすく、速度/サイズの違いはありません(。

他のDBでも、JSONをテキストとして保存できることがよくあります。例えば。 MySQLにも、かなりの量のテキストを処理できるテキストフィールドがあります(LONGTEXT = 4Gb)。ええ、オラクルは遅れていますが、うまくいけば、彼らは時々妥当な長いテキストフィールドを取得するでしょう。

しかし、なぜJsonオブジェクト全体をテキストとして保存したいのですか? jsonは実際には正規化され、DB内の複数のフィールドとして格納されている必要があります。

0
Astrogat

JSONを格納するには、テキストがblobよりも優れていると私は間違いなく言います。 JSONは最終的にテキストであるため、このタイプは理にかなっていますが、一部のドライバーでは、挿入する前に16進数に変換する必要があるため、blobに余分なオーバーヘッドが生じる場合があります。また、cqlshを使用すると、blobはbase64でエンコードされた文字列として表示されるため、テストのために必要な場合、実際に格納されているJSONを簡単に確認することはできません。 blobがディスクにどのように格納されるかは正確にはわかりませんが、テキストと同じように見えると思います。

そうは言っても、大きなエントリを保存すると問題が発生する可能性があり、 推奨されません になります。これにより、シャーディングで問題が発生し、大量のメモリを消費する可能性があります。 FAQは64MBを超えるファイルを指しますが、経験上、平均でそれぞれ数メガバイトのファイルであっても、大量のファイルの保存を開始するとパフォーマンスの問題が発生する可能性があります。可能であれば、 JSONのサイズがメガバイトになることが予想される場合はオブジェクトストアを使用し、代わりにそのストアへの参照をCassandraに保存します。

0
Jonathan