Cassandra 数据建模:使用地图还是有很多空列?

Cassandra Data Modelling: Use a Map or have a lot of empty columns?

我总共需要将大约 20-30 列存储在我的列族中。但是,我的数据有不同的变化。我有 不同的对象 在逻辑上属于一起但没有相同的字段(字段如键名)。有时会提供 5 个字段,有时会提供 7 个字段,依此类推。尽管它们都共享始终提供的一部分字段。

我在此列族中插入的行永远不会填充所有列。使用 Map 时,我可以根据对象类型添加 key/values,并且不会有其他模型引入的可能开销。

我担心每行中有很多空列。

使用地图的一个可能的缺点是 you can't have an index for map keys and map values coexist

收集到的问题:

  1. 你建议我使用 Map 还是只将我可能需要的所有列添加到我的列族中?
  2. 我假设在地图中基于 keys/values 查询数据比从列中访问数据 "directly" 慢得多。这是正确的吗?
  3. 当每行有很多空列时,有什么缺点?高架?
  4. 使用 Map 时是否可以有 "generic" 值类型?我想存储不同的数据,主要是字符串,还有浮点数和整数。我是否需要使用 map<text,text> 并在我的应用程序中转换值?

我正在使用 Cassandra 3.0.8 | CQL 规范 3.4.0 |本机协议 v4

谢谢

我认为具有稀疏列值完全没问题,因为这是创建 BigTable 和实现相同稀疏地图数据模型的所有相关解决方案的原因之一。

我会更关心使用 cql 集合的限制,正如另一个 S.O 中指出的那样。回答 here.

关于您的具体问题:

  • 我个人会使用普通列。
  • 这取决于访问模式。您需要地图中的所有列吗?如果没有,请注意 Cassandra 将检索整个集合,因此即使不需要,您也会获得所有数据。
  • 我在这里没有看到任何开销:数据将被连续存储而忽略空列

无论如何,您可以找到一些有关 Cassandra 限制的信息 here。这是一个旧页面,但我假设您可以将它们用作更新值的下限。

希望对您有所帮助。

实际上,Map、Set、List 只是粗体 Cassandra 数据结构的 CQL 语法,映射存储为通常的宽行。

这里有几个Slides关于映射cql类型