2012-02-16 4 views
1

나는 RavenDB에서 효율적인 방식으로 문서 구조를 디자인하고 저장하기 위해 몇 가지 다른 옵션을 시험 중이다.문서 디자인

사용자를 처리하는 구조는 세션 및 활동 추적 정보입니다.

사용자가 시스템에 로그인하고 활동이 생성되기 시작하면 세션이 시작됩니다. 세션 당 수백 개의 활동이있을 수 있습니다. 사용자가 닫거나 로그 아웃 할 때 세션이 종료됩니다.

시나리오를 약간 복잡하게 만드는 요소는 세션이 실시간으로 웹 포털에 표시된다는 것입니다. 다른 말로하면 : 세션과 활동을 추적하고 진행 중인지 (그리고 얼마나 오래 실행 중인지) 또는 완료되었는지를 알 수 있도록 이들을 연관시켜야합니다.

당신은 또한 물론 역사에서 주위를 파다 수 있습니다.

는 제가 조사를 좀 해봤 스택 오버 플로우에 두 개의 관련 질문을 여기에서 찾을하지만 그들 중 누구도 정말 날 도왔 : Document structure for RavenDB Activity stream design with RavenDb

내가 성공적으로 아군있는 한 두 가지 옵션 : (간체 구조)

을 1 :

{ 
    "User": "User1", 
    "Machine": "machinename", 
    "StartTime": "2012-02-13T13:11:52.0000000", 
    "EndTime": "2012-02-13T13:13:54.0000000", 
    "Activities": [ 
    { 
     "Text": "Loaded Function X", 
     "StartTime": "2012-02-13T13:12:10.0000000", 
     "EndTime": "2012-02-13T13:12:10.0000000" 
    }, 
    { 
     "Text": "Executed action Z", 
     "StartTime": "2012-02-13T13:12:10.0000000", 
     "EndTime": "2012-02-13T13:12:10.0000000" 
    } 
} 

2 :

{ 
    "Session" : "SomeSessionId-1", 
    "User": "User1", 
    "Machine": "machinename", 
    "Text": "Loaded Function X", 
    "StartTime": "2012-02-13T13:12:10.0000000", 
    "EndTime": "2012-02-13T13:12:10.0000000" 
} 

{ 
    "Session" : "SomeSessionId-1", 
    "User": "User1", 
    "Machine": "machinename", 
    "Text": "Executed action Z", 
    "StartTime": "2012-02-13T13:12:10.0000000", 
    "EndTime": "2012-02-13T13:12:10.0000000" 
} 

대체 1은 관계형 배경에서 더 자연 스럽다고 느낍니다. 세션을로드하고 이벤트를 추가하고 저장하는 것은 정말 간단합니다. Session 객체를로드하는 오버 헤드와 매번 추가되는 이벤트는 매번 삽입 성능에 좋지 않습니다.

대체 2는 훨씬 효율적으로 느껴지고 이벤트를 추가 할 수 있습니다 (거의 이벤트 소싱과 유사). 그러나 이벤트를 파고 세션별로 표시 할 때 선택 사항은 좀 더 복잡해집니다.

아마도 더 좋은 대안이 있습니까? 솔루션은 이벤트를 분리하고 다른 읽기 모델을 생성 할 수 있습니까? 문제가 과도하게 복잡합니까?

+0

여러 사용자가 동시에 여러 세션 (활동)을 만들 수 있습니까? – ZVenue

+0

예 동시에 여러 사용자가있을 수 있습니다. 물론 자신의 세션에만 활동을 추가 할 것입니다. – Jon

+0

사용자 이름과 컴퓨터를 유지하는 유일한 이유는 UI로 그룹화/정렬 할 수 있기 때문입니다. – Jon

답변

0

사용자 문서와 세션 문서 만 있으면됩니다. "User"와 "Session"에 대한 두 개의 모델을 만듭니다. 세션 문서는 하나의 속성으로 userid를가집니다. Session에는 중첩 된 "activity"속성도 있습니다. 이 경우 실시간 사용자 - 세션 - 활동을 쉽게 표시 할 수 있습니다. 더 자세한 내용을 알지 못하는 사이에, 나는 단순화 된 과정을 끝내고 있습니다.

편집 :

//Sample User Document 

{ 
    UserId:"ABC01", 
    HomeMachine:"xxxx", 
    DateCreated:"12/12/2011" 
} 


//Sample Session Document 

{ 
    UserId:"ABC01", 
    Activities 
    { 
     Activity 1 properties 
    } 
    { 
     Activity 2 properties 
    } 
    ... 
    ... 
    etc.. 

} 
+0

그래서 이것은 나의 옵션 1이지만 사용자는 자신의 문서로 뽑아 냈습니다. – Jon

+0

세션 내에서 세션과 활동을 표시해야하는 경우 개별 세션과 모든 관련 활동을 하나의 문서로 유지하는 것이 좋습니다. 그런 모든 세션 문서를 로그인 한 단일 사용자 문서에 연결하십시오. – ZVenue

+0

무슨 뜻인지 알 것 같습니다. 나는 사용자, 기계 및 세션 세부 사항을 포함하는 세션을위한 문서를 향하고있다. 그리고 세션을 참조하는 활동 문서. – Jon

0

나는 확실히 당신이 2. 문서 옵션 1에서 매우 큰 성장하지 않음 옵션의 일부 변종과 함께 가야한다고 생각? 그러면 삽입이 매우 느려질 수 있습니다. 난 정말 세션 당 보여주는 이벤트가 더 이상 복잡한 옵션 2 옵션 1보다 왜 볼 수 없습니다, 당신은 단지

session.Query<Event>().Where(x => x.Session == sessionId) 

와 세션으로 이벤트를 선택하고 RavenDB 자동으로에 대한 인덱스를 생성합니다. 더 복잡한 쿼리를 만들고 싶다면 더 전문화 된 인덱스를 만들 수 있습니다.

+0

나는이 해결책을 너무 좋아한다. 내가 가진 문제는 해당 구조를 사용하는 활성 세션을 보여주는 것입니다. 아마도 하이브리드가 가장 좋을 것입니다 - 세션 문서를 만든 다음 간단한 id 참조를 사용하여 더미에 이벤트를 덤핑하십시오 – Jon