在cassandra中将json存储为文本与blob的优缺点是什么?

2022-09-03 02:02:32

对我来说,blob的一个问题是,在java中,ByteBuffer(在cassandra中映射到blob)是不可序列化的,因此不能很好地与EJB一起使用。

考虑到json相当大,在cassandra中存储json的更好类型是什么。是文本还是斑点?

在决定 blob 与 json 时,json 的大小是否重要?

如果它是任何其他数据库,如oracle,则通常使用blob / clob。但是在Cassandra,每个单元可以容纳2GB,这重要吗?

在这种情况下,请考虑将此问题视为在文本与 blob 之间进行选择,而不是对有关是否对 json 使用单列的建议进行排序。


答案 1

我不认为将文字JSON数据存储在Cassandra中有任何好处。充其量,您的存储成本是相同的,并且通常API在处理类型方面不太方便,因为它们用于处理字符串/文本。BLOBBLOB

例如,如果您使用的是他们的Java API,那么为了将数据存储为使用参数化,您首先需要将其全部加载到,例如通过将JSON数据打包到.BLOBPreparedStatementByteBufferInputStream

除非您正在处理非常大的 JSON 片段,这些片段迫使您无论如何都要流式传输数据,否则要访问该类型需要做相当多的额外工作。你会从中得到什么?基本上什么都没有。BLOB

但是,我认为问“我应该将JSON存储为文本,还是将其gzip并将其存储为BLOB?”是有一些优点的。

答案可以归结为你如何配置Cassandra和你的桌子。特别是,只要您使用的是 Cassandra 版本 1.1 或更高版本,您的表就会默认启用压缩。这可能就足够了,特别是如果 JSON 数据在每行中相当统一的情况下。

但是,Cassandra 的内置压缩是在表范围内应用的,而不是应用于单个行。因此,通过在存储之前手动压缩 JSON 数据,将压缩的字节写入 ,然后将数据作为 .ByteBufferBLOB

因此,它基本上归结为在存储空间与编程便利性与CPU使用率方面的权衡。我将按以下方式决定此事:

  1. 最小化存储消耗量是您关心的问题吗?
    • 如果是,请压缩 JSON 数据并将压缩的字节存储为BLOB;
    • 否则,请继续执行 #2。
  2. Cassandra 的内置压缩是否可用并为您的表启用?
    • 如果不是(并且无法启用压缩),请压缩 JSON 数据并将压缩的字节存储为BLOB;
    • 否则,请继续执行 #3。
  3. 您将要存储的数据在每行中是否相对统一?
    • 对于JSON数据,答案可能是“是”,在这种情况下,您应该将数据存储为文本并让Cassandra处理压缩;
    • 否则,请继续阅读 #4。
  4. 您想要效率还是便利?
    • 效率;压缩 JSON 数据并将压缩的字节存储为 .BLOB
    • 方便;压缩 JSON 数据,将压缩数据 base64,然后将 base64 编码的数据存储为文本。

答案 2

由于数据不是二进制的,因此几乎没有理由使用二进制大型OBject。当然你可以做到,但为什么呢?对于人类来说,文本更容易阅读,并且没有真正的速度/大小差异(。

即使在其他数据库中,您通常也可以将 JSON 存储为文本。例如,甚至MySQL也有文本字段可以处理相当多的文本(LONGTEXT = 4Gb)。是的,Oracle落后了,但希望他们有时也会得到一个合理的长文本字段。

但是,为什么要将整个 Json 对象存储为文本呢?json 实际上应该被规范化并存储为数据库中的多个字段。