2016-07-19 31 views
2

我有大约20-30列,我需要在我的专栏家庭中储存。但是,我的数据有不同的变化。我有不同的对象在逻辑上属于一起,但没有相同的字段(字段中的键名称)。有时,提供5个字段,有时7个字段等。它们都共享一部分始终提供的字段。Cassandra数据建模:使用Map还是有很多空列?

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

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

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

问题云集:

  1. 你建议我使用地图或者只是添加所有我需要我的专栏的家人列?
  2. 我假设根据Map中的键/值查询数据比从列直接访问数据要慢。它是否正确?
  3. 当我每行有很多空列时,有什么缺点?高架?
  4. 当使用Map时,是否有可能具有“通用”值类型?我想存储不同的数据,主要是字符串,但也浮动和整数。我是否需要使用map<text,text>并在我的应用程序中投射这些值?

我正在使用Cassandra 3.0.8 | CQL规范3.4.0 |本地协议V4

感谢

回答

2

我认为有稀疏列的值是完全罚款,因为这就是为什么实现相同的稀疏地图数据模型的BigTable和所有相关的解决方案是为创造一个原因。

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

关于你提到的具体问题:

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

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

希望它有帮助。

+0

使用普通的列会迫使我到列的严格数量的若干Slides,对不对?使用收集方法时,添加新列时我会更加灵活。如果模式已经有xx GB数据,甚至可以向模式添加更多列? – j9dy

+1

使用普通列,我认为你应该用最大数量的列来定义你的模式。这里没有缺点,因为如果一行没有特定的列,它不会浪费空间。如果需要,您仍然可以向模式添加新列。正如文档[here](https://docs.datastax.com/en/cql/3.1/cql/cql_reference/alter_table_r.html)中指出的那样,向模式添加列不会验证过去的数据。使用一个集合可以缩短你的模式,但是你会在答案中指出缺点。 – riccamini

1

实际上,Map,Set,List对于老Cassndra数据结构来说只是CQL sintax,并且映射存储为通常的宽行。

以下是有关映射CQL类型