Data structures Cassandra DB:为每行多个标准编制索引是有利的还是不受欢迎的?

Data structures Cassandra DB:为每行多个标准编制索引是有利的还是不受欢迎的?,data-structures,cassandra,Data Structures,Cassandra,最近我读了很多关于Cassandra的书,特别是如何构造行以利用索引/排序,但有一件事我还不清楚;列族(CF)行中应包含多少“索引”项(或过滤器,如果需要) 具体来说:我正在构建一个应用程序,并将使用Cassandra归档日志数据,我将使用这些数据进行分析 分析搜索的示例类型包括(按日期范围): 特定现场部分的总访问量 按国家分列的访问总数 交通源 我计划以JSON格式存储整个日志对象,但为了避免为了获取基本数据而必须遍历每一项,或者为了获取基本数据而创建多个CF,我很想知道将上述“过滤器”

最近我读了很多关于Cassandra的书,特别是如何构造行以利用索引/排序,但有一件事我还不清楚;列族(CF)行中应包含多少“索引”项(或过滤器,如果需要)

具体来说:我正在构建一个应用程序,并将使用Cassandra归档日志数据,我将使用这些数据进行分析

分析搜索的示例类型包括(按日期范围):

  • 特定现场部分的总访问量
  • 按国家分列的访问总数
  • 交通源
我计划以JSON格式存储整个日志对象,但为了避免为了获取基本数据而必须遍历每一项,或者为了获取基本数据而创建多个CF,我很想知道将上述“过滤器”作为列(复合列段)包含是否是一个好主意

例如:

   Row Key       | timeUUID:data | timeUUID:country | timeUUID:source |
                 ======================================================
timeUUID:section |  JSON Object  |       USA        |   example.com   |
从结构中可以看出,行键是timeUUID(比如每天)加上我想要获取统计数据的站点部分的复合键。这使我可以很容易地查询日期范围

接下来是我的困境,专栏。带有timeUUID的复合列名允许我进行排序和基于时间的切片,但是这个概念有意义吗

目前的“最佳实践”是否可以接受这种结构,还是不赞成这种结构?是否建议为我要查询的每个指标创建一个单独的“索引”CF?(即使是这么简单?)


我宁愿第一次就把这件事做好,而不必在以后重构数据和重构我的应用程序代码。

我认为这背后的想法没问题。这是一种非常常见的时间选择方法(假设我已经理解了您的模式——创建表片段就好了)。一些小的调整

您不需要使用timeUUID作为行键。考虑到您建议按个别天数进行分区(这本身是唯一的),您不需要UUID方面。时间戳可能很好,甚至更简单,格式为YYYYMMDD的varchar(或您喜欢的任何安排)

您可能还希望将行键组合切换到section:time。这样做的原因是,如果需要指定IN子句(即抓取多天),则只能在键的最后一部分执行。这意味着您可以在(..)中执行section='foo'和time。我想这是一个更常见的用例——但显然是你的决定

如果您的常见情况是查询最新的数据,请不要忘记按降序对timeUUID列进行集群。这使热柱保持在顶部

双重存储内容是可以的(即JSON有效负载一次,需要查询的数据再次非规范化)。储存很便宜


我认为您不需要索引,但这取决于您打算运行的查询。如果您的查询很简单,那么您可能希望按(日期:参数)而不是值来存储计数器,并在收到数据时增加计数器。

谢谢您的建议,非常有用。我也在考虑行键中的一个简单日期,但您对YYYYMMDD格式的建议非常好。此外,列复合键顺序;我对卡桑德拉显然是个新手,这个建议很有价值。