2013-04-01 71 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