2013-04-01 72 views
1

我想在卡桑德拉为CDR(通话详细记录)数据设计一个数据模型,以便我们可以在同一行的同一手机号码或一组通过相同的手机号码为每个呼叫动态添加列。它也可以支持这样的查询,如 哪些手机号码。在两个给定日期或给定时间(例如,上午9点至下午7点)之间称为最大时间?卡桑德拉CDR数据建模数据建模

你的建议是非常可观的。提前致谢。

回答

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查询每一行(在分布式数据库中,它不会特别高效)。

对于像“哪个号码在9AM和7PM之间被称为最多”这样的查询,我会考虑第二个CF,它将列出所有按时间顺序进行的调用。

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

所以每次写入CDR CF的时候,你会还添加了一个新列CallIndex CF,列出了呼叫和拨打的号码的时间。然后,您可以查询CallIndex CF中两个日期/时间范围之间的所有列,并解析结果以获取被称为最多的数字。

+0

感谢您的详细描述,它可以帮助我以正确的方式继续进行。 – adityak

+0

我不确定这个功能,也就是说我们是否可以在不同的时间重复添加一组列。请给出你的意见。 – adityak

+0

但在CDR_column_family,如果我们正在考虑暴徒。没有。作为一个行键,那么行数将会非常高(就像印度有大约9.6亿用户一样,所以不会有9.6亿)。所以,这可能会导致低性能。 – adityak