2013-04-01 1 views
1

CDR (호출 세부 레코드) 데이터에 대해 cassandra에서 데이터 모델을 설계하려고합니다. 동일한 휴대 전화 번호 또는 동일한 세트의 동일한 행에 호출 정보를 저장하고 계속 추가 할 수 있습니다 열은 동일한 전화 번호로 각 통화에 대해 동적으로 추가됩니다. 또한 모바일 번호가 인 쿼리를 지원할 수 있습니다. 주어진 두 날짜 또는 주어진 시간 사이의 최대 시간 (예 : 오전 9 시부 터 오후 7 시까 지)?CDR 데이터에 대한 cassandra의 데이터 모델링

제안 사항은 매우 유용합니다. 미리 감사드립니다.

답변

2

카산드라 데이터 모델을 디자인 할 때 가장 먼저해야 할 일은 만족해야하는 모든 쿼리를 나열하는 것입니다. 들어오는 CDR 데이터의 양 (데이터를 적절하게 분할 할 수 있도록)과 각 쿼리가 얼마나 자주 실행되는지 (즉, 고주파 쿼리가 빠른 읽기 성능과 일치하도록) 고려하는 것도 중요합니다.

Cassandra의 비 관계 특성과 CQL의 제한된 쿼리 기능 (기존 RDS와 비교)으로 인해 데이터베이스 디자인은 주로 실행해야하는 쿼리에 의해 결정됩니다. 예제를 기반으로 이러한 종류의 쿼리를 충족시키기 위해서는 여러 열 패밀리가 필요할 것입니다.

원시 CDR을 저장하는 관점에서 행 키가 휴대 전화 번호이고 열 이름이 전화가 걸린 시간 스탬프 인 단일 '와이드 행'열 패밀리를 가질 수 있습니다. 그런 다음 들어오는 각 CDR에 대해 해당 모바일 번호와 일치하는 행에 새 열을 추가하기 만하면됩니다.

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

여기서주의해야 할 것은 행이 얼마나 넓어 질 수 있는지입니다. 매일 이상한 전화를 처리한다면 충분할 수 있습니다. 그러나 매일 수백 건이 더 많이 호출되는 경우 성능을 저하시키지 않도록 데이터를 분할 할 수 있습니다. 따라서 행 키는 모바일 숫자/월 복합 요소 (예 : '07870 831137 : 201304')가 될 수 있으며 한 달에 휴대 전화 번호 당 행이 있습니다.

이 CF는 "07870 831137에 9AM에서 7PM 사이의 통화가 몇 번 있었는지"와 같은 쿼리를 충족하지만 CF에서 모든 단일 행을 쿼리하지 않고 "9AM에서 7PM 사이의 전화 번호가 가장 많습니다" (분산 데이터베이스에서 특히 효율적이지는 않습니다).

"어떤 번호가 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

관련 문제