1

我正在尝试在 cassandra 中为 CDR(呼叫详细记录)数据设计一个数据模型,以便我们可以在同一手机号码的同一行中存储并继续添加呼叫详细信息,或者为每个呼叫动态添加一组列手机号码。它还可以支持查询,例如,哪个手机号码。称为两个给定日期或给定时间之间的最大时间(例如,上午 9 点到晚上 7 点之间)?

您的建议非常值得赞赏。提前致谢。

4

1 回答 1

2

在设计 Cassandra 数据模型时,您需要做的第一件事就是列出所有需要满足的查询。考虑传入 CDR 数据的数量(以便您可以适当地对数据进行分片)以及每个查询可能运行的频率(以便高频查询与快速读取性能相匹配)也很重要。

由于 Cassandra 的非关系性质,以及 CQL 的有限查询能力(与传统的 RDS 相比),数据库设计很大程度上取决于您需要运行的查询。根据您的示例,您可能需要多个列族来满足这些类型的查询。

作为起点,就存储原始 CDR 而言,您可以有一个“宽行”列族,其中行键是手机号码,列名是拨打电话的时间戳。然后,对于每个进来的 CDR,您只需在与该手机号码匹配的行中添加一个新列。

CDR_column_family
    mobile_number <- row key
        timestamp:null <- column name:column value

您需要注意的是行可能会变得多宽。如果您每天处理奇数电话,那么这可能就足够了,但如果它更像是每天数百个电话,您可能希望对数据进行分片,以免降低性能。因此,您的行键可以成为一个手机号码/月份组合(例如'07870 831137:201304'),并且每个手机号码每个月都有一行。

此 CF 将满足诸如“上午 9 点到晚上 7 点之间对 07870 831137 进行了多少次呼叫”之类的查询,但它不会告诉您“上午 9 点到晚上 7 点之间呼叫最多的号码”,而不查询 CF 中的每一行(其中,在分布式数据库,不会特别有效)。

对于像“上午 9 点到晚上 7 点之间哪个号码被呼叫最多”这样的查询,我会考虑第二个 CF,它将按时间顺序列出所有呼叫。

CallIndex_column_family
    month <- row key
        timestamp:mobile_number <- column name:column value

因此,每次您写入 CDR CF 时,您还会向 CallIndex CF 添加一个新列,列出通话时间和拨打的号码。然后,您可以查询两个日期/时间范围之间的所有列的 CallIndex CF,并解析结果以获取调用次数最多的数字。

于 2013-04-02T11:34:24.653 回答