我正在努力为Cassandra列族/表格找出正确的数据模型,这样我就可以查询我需要的内容。
我只需要为单一类型的实体存储数据,代表金融交易。主要字段(适用于查询,排序):
还有其他字段(总共约20个),但查询或订购时不需要这些字段。
我需要通过以下两种方式查询交易:
UUID查询需要快速,虽然日期范围查询应尽可能高效,但它每天作为离线流程运行,因此可能需要更长时间。理解查询时间如何与否进行比较是很好的。记录。
如果这影响了分区密钥配置,Cassandra将被设置为跨4个数据中心的4个节点的集群。我正在使用Cassandra 2.0。
对Cassandra来说有些新鲜,我一直在阅读关于复合键,timeuuid,切片查询等但是有点困惑。如果有人能够提出正确的方法,或指出我正确的方向,我将非常感激。
感谢。
答案 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子句。
检索由单个主键唯一标识的行的查询非常快。从非常宽的分区获取的查询可能会稍慢,但它仍然比尝试使用辅助索引完成相同的操作更快。