가정하자 내가 가지고있는 다음과 같은 이벤트 데이터 방식 :최고의 데이터베이스 화 연습
이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는 데이터 (및 스키마를 참조하는 각 문서)를 압축 할 수있게합니다.
위 예제의 경우 어떤 데이터베이스가 권장 될까요?
주어진 시점에 얼마나 많은 이벤트를 추적해야합니까? –
10 초 또는 20 초? 각각은 500 가지 정도의 구체적인 이벤트 유형 중 하나로 구성됩니다. – user48956