2013-09-06 3 views
0

가정하자 내가 가지고있는 다음과 같은 이벤트 데이터 방식 :최고의 데이터베이스 화 연습

event_record_unique_id: long 
event_timestamp: long 
session_id: long 
event_id: int 
event_data: data # concrete type depends on event_id 

... 그래서,에 따라 달라질 수 있습니다 데이터의 내용,지도,의 500, event_ids을 가정 해 봅시다 "데이터"에 대한 200 가지 구체적인 데이터 유형. 또한

{ 
    event_record_unique_id: 17126721 
    event_timestamp: 1234 
    session_id: 3452 
    event_id: 50 
    event_data: { 
     user_id: 123 
     page_id: 789 
    } 
} 
{ 
    event_record_unique_id: 1712672123 
    event_record_unique_id: 17126723 
    event_timestamp: 1234 
    session_id: 3454 
    event_id: 51 
    event_data: { 
     user_id: 124 
     button_id: 789 
    } 
} 
{ 
    event_timestamp: 1234 
    session_id: 3454 
    event_id: 51 
    event_data: { 
     crash_report: "text" 
     device_id: "12312" 
    } 
} 

: 예를 들어, EVENT_DATA 속성

  • 많은 콘크리트 EVENT_DATA의 많은에 표시 (예 : 나를 찾을
  • 내가 EVENT_DATA의 일부 속성에 인덱스 검색을 수행해야하는 객체 모든 레코드 where user_id = X)
  • 이벤트 유형 및 새 속성을 계속 추가 할 필요가 계속 있습니다.
  • 위 데이터 구조는 항상 평범하게 평평합니다 단일 레코드가 N 개의 열이있는 행과 동등하게 표현 될 수 있도록 (그리고 특성 이름을 변경하여 특성 이름/형식 충돌 을 해결할 수 있도록)

순진한 RDBMS 접근법은 ~ 500 개의 테이블 (구체적인 유형의 "데이터"당 하나)을 만드는 것이 포함됩니다. 나는이 접근법을 할인했다 (= 모델링에서의 인간 노력의 지나친 낭비). 또한 user_id를 통해 모든 레코드를 쉽게 검색 할 수 없습니다 (user_id는 매우 많은 테이블에 나타납니다).

RDBMS에서 구조를 평평하게하는 것은 또한 꽤 비쌉니다 (N-8 개의 요소는 NULL이며 정보가 없습니다).

몽고 (Mongodb) 형식의 문서 데이터베이스 솔루션이 좋지만, RDBMS보다 각 레코드마다 속성 이름을 붙이면 공간 비용이 상당히 많이 소요됩니다. 그러나 이렇게하면 데이터 개체의 필드를 기준으로 인덱싱 할 수 있습니다.

나를 위해 이상적인 데이터 표현은 많은 null 요소가있는 행을 허용하도록 최적화 된 테이블입니다 (예 : 행당 활성 열 비트 마스크 유지). 또는 문서 컬렉션이 사용되는 문서 스키마의 라이브러리를 유지하는 문서 DB는 데이터 (및 스키마를 참조하는 각 문서)를 압축 할 수있게합니다.

위 예제의 경우 어떤 데이터베이스가 권장 될까요?

+0

주어진 시점에 얼마나 많은 이벤트를 추적해야합니까? –

+0

10 초 또는 20 초? 각각은 500 가지 정도의 구체적인 이벤트 유형 중 하나로 구성됩니다. – user48956

답변

1

MS SQL Server 2008 이상은 Sparse Columns입니다. 테이블에 최대 30,000 개를 추가 할 수 있으며 인덱싱 할 수 있습니다 (필터링 된 인덱스 권장). BOL이 그렇게 말하면, 나는 그들 자신을 사용하지 않았다. 이렇게하면 필요한 것을 지원할 수있는 매우 큰 단일 테이블이 생성됩니다.

그 말로는 특히 효율적 일지 모르겠다. 일부 수학 :

  • 10 개 행을 가정 해 보자
  • 매우 거친 과다 추정으로 10 * 60 * 60 * 24 = 864,000 행 일
  • 또는 315,360,000 행 년
  • 된다 초 50 바이트 1 행
  • 은 연간 약 14GB입니다.
  • 몇 년 동안 데이터를 보관해야합니까?
  • 하고 두 번째

당 같은 20 개 행을, 그래서 경우 저장이 너무 길 밖으로 줄 것 같지 않습니다 ...하지만 난 당신이 몇 가지 심각한 크기의 프로젝션을 작업 할, 모르는 더블 요인. 그리고 그것은 단지 스토리지 일뿐입니다. 무엇을 원하거나 필요합니까? 데이터로을 처리합니까? 지정된 행의 검색 시간이 중요합니까? 분석 및 데이터 마이닝은 어떻습니까? 저는 SQL 녀석입니다. 생각해 봅니다. 그러나 이것은 거의 Hadoop과 NoSQL 솔루션이 고안된 문제이며 철저히 조사 할 가치가 있습니다.

관련 문제