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

时间:2016-07-19 14:12:28

标签: cassandra cql cql3 nosql

我有大约20到30个列,我需要存储在我的列族中。但是,我的数据有不同的变化。我有不同的对象逻辑上属于一起但没有相同的字段(字段与键名称)。有时提供5个字段,有时提供7个字段,依此类推。所有这些都共享一部分始终提供的字段。

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

我担心每一行都有很多空列。

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

收集的问题:

  1. 您是否建议我使用地图,或者只是将我可能需要的所有列添加到我的列系列中?
  2. 我认为根据Map中的键/值查询数据的速度比"直接"从列中访问它们。这是对的吗?
  3. 当每行有很多空列时会有什么缺点?高架?
  4. 是否可以拥有&#34;泛型&#34;使用Map时的值类型?我想存储不同的数据,主要是字符串,还有Floats和Integers。我是否需要使用map<text,text>并在我的应用程序中转换值?
  5. 我正在使用Cassandra 3.0.8 | CQL规范3.4.0 |原生协议v4

    谢谢

2 个答案:

答案 0 :(得分:2)

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

我将更关注使用cql集合的限制,正如另一个S.O.所指出的那样。回答bounding box

关于您的具体问题:

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

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

希望它有所帮助。

答案 1 :(得分:1)

实际上,Map,Set,List只是旧Cassndra数据结构的CQL sintax,以及存储为通常宽行的映射。

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