有序范围查询的Cassandra数据模型

时间:2014-04-26 10:47:35

标签: database-design cassandra cassandra-2.0

我正在努力为Cassandra列族/表格找出正确的数据模型,这样我就可以查询我需要的内容。

我只需要为单一类型的实体存储数据,代表金融交易。主要字段(适用于查询,排序):

  1. uuid:每笔交易的唯一ID
  2. 时间戳:交易时间
  3. source_id:string(低基数,通常<数据集中的10个唯一值)
  4. destination_id:string(低基数,通常<数据集中的10个唯一值)
  5. merchant_id:string(高基数,~100k唯一值)
  6. 还有其他字段(总共约20个),但查询或订购时不需要这些字段。

    我需要通过以下两种方式查询交易:

    1. 通过UUID
    2. 按日期范围,对于source_id / destination_id的确切值,按merchant_id
    3. 排序

      UUID查询需要快速,虽然日期范围查询应尽可能高效,但它每天作为离线流程运行,因此可能需要更长时间。理解查询时间如何与否进行比较是很好的。记录。

      如果这影响了分区密钥配置,Cassandra将被设置为跨4个数据中心的4个节点的集群。我正在使用Cassandra 2.0。

      对Cassandra来说有些新鲜,我一直在阅读关于复合键,timeuuid,切片查询等但是有点困惑。如果有人能够提出正确的方法,或指出我正确的方向,我将非常感激。

      感谢。

1 个答案:

答案 0 :(得分:2)

查询1非常简单,在CQL3中,它看起来像:

create table tx_by_uuid (
tx_id uuid PRIMARY KEY,
tx_time timestamp,
source_id text,
dest_id text,
merchant_id text
) 

查询2有点复杂: (注意,我在这里假设source_id / destination_id指的是要求两者都被指定,而不是和/或情况)

由于我们希望通过source_id / destination_id的精确值进行查询,因此我们理想地希望使用这些列的组合作为分区键的主键。由于这些是低基数列,我们可能遇到块状分区的问题,但由于您已经给我们一些关于节点数量的额外信息,我们可以通过观察来说服自己source_id + destination_id是该表的可接受的分区键如果这些列中的每一列具有大约10个不同的值,则在组合时,将存在大约100个不同的值。在较大的集群中,这不是理想的数据分发,我们可能希望为分区键添加临时桶,但对于四节点集群,我们可能在这里。

由于我们还希望按数据范围进行查询,因此我们希望将tx_time列包含为聚类列。此外,由于我们希望查看商家订购的结果,因此还需要成为聚类列。最后,为了确保主键唯一地标识它们各自的事务,tx_id应该是最后一个集群列。因此查询2的表可能如下所示:

create table tx_by_merchant(
tx_id uuid,
tx_time timestamp,
source_id text,
dest_id text,
merchant_id text,
primary key((source_id, dest_id), tx_time, merchant_id, tx_id)
)

请注意,这些分区可能非常宽,因此最好将一年+月的补充列添加到分区键中以便稍微破坏它们。此外,如果您需要反转排序,请查看WITH CLUSTERING ORDER子句。

检索由单个主键唯一标识的行的查询非常快。从非常宽的分区获取的查询可能会稍慢,但它仍然比尝试使用辅助索引完成相同的操作更快。