2012-02-16 148 views
1

我正在嘗試一些不同的選項來在RavenDB中以有效的方式設計和存儲文檔結構。文檔設計

我正在處理用戶的結構是會話和活動跟蹤信息。

會話在用戶登錄系統並開始創建活動時啓動。每個會話可能有數百個活動。 會話在用戶關閉/註銷時結束。

使情景稍微複雜化的一個因素是會話實時顯示在Web門戶中。換句話說,我需要跟蹤會話和活動,並將它們關聯起來,以便能夠確定它們是否正在進行(以及它們已經運行了多久)或者它們是否已完成。

你也可以在歷史中挖掘歷史。

我做了一些研究,發現這裏有兩個相關的問題上堆棧溢出,但沒有人真的幫了我: 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,添加事件和存儲很簡單。每次加載Session對象和附加事件的開銷都會影響插入性能。

方案2感覺效率更高,我可以簡單地附加事件(幾乎像事件源)。但是,在事件中進行挖掘並在每個會話中顯示它們的選擇會變得更加複雜。

有沒有第三個更好的選擇? 解決方案是分開事件並創建另一個讀取模型嗎? 我是不是在過度複雜的問題?

+0

可以有多個用戶同時創建多個會話 - 活動嗎? – ZVenue 2012-02-17 01:43:22

+0

是的,可以有多個用戶在同一時間,他們當然只會將活動添加到他們自己的會話 – Jon 2012-02-17 08:25:33

+0

要清楚:我保留用戶名和機器的唯一原因是能夠在用戶界面中對它們進行分組/排序 – Jon 2012-02-17 08:31:50

回答

0

看起來你只需要一個用戶文檔和一個會話文檔。爲「用戶」和「會話」創建兩個模型。會話文檔將具有userid作爲一個屬性。會話也會嵌套「活動」屬性。在這種情況下,很容易顯示實時用戶 - 會話 - 活動。不知道更多細節,我過於簡化課程。

編輯:

//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 2012-02-17 08:27:21

+0

如果您需要在會話中顯示會話和活動,將單個會話和所有相關活動保存在一個文檔中是有意義的。並將所有這些會話文檔與登錄的單個用戶文檔關聯起來。 – ZVenue 2012-02-17 17:40:05

+0

我明白你的意思了。我傾向於包含用戶,機器和會話詳細信息的會話文檔。並引用會話的活動文檔。 – Jon 2012-02-17 21:15:52

0

我絕對認爲你應該選擇的一些變種2.將不會在文檔生長在選項1非常大的去了?這可能會使插入非常緩慢。 我真的不能明白爲什麼每個會話展示活動將是選項2比1選擇任何更復雜,你可以選擇通過會話事件與

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

和RavenDB將自動爲它創建一個索引。如果你想做更復雜的查詢,你總是可以爲它創建更專業的索引。

+0

我也喜歡這個解決方案。我擁有的問題是顯示使用該結構的活動會話。也許一個混合是最好的 - 一個Session文檔,然後使用簡單的id引用將一堆事件轉儲 – Jon 2012-02-17 21:10:10