2012-02-27 70 views
0

我是RavenDB的新手,我仍然努力想方設法爲當前場景建立數據模型。這裏是數據的樣子。如何在RavenDB中建立足球比賽統計數據模型

Game 
- Teams 
    - Team 1 
    - list of players 
    - Team 2 
    - list of players 
- Events 
    - Event 1 
    - type: Pass 
    - teamId 
    - PlayerId 
    - Event 2 
    - type: Goal 
    - teamId 
    - PlayerId 

在每場比賽開始時,我們得到的遊戲(例如團隊,地點等),然後每隔幾分鐘我們得到事件的更新列表的整體信息。 另外,我需要能夠查詢特定玩家在遊戲中的數據(例如玩家有多少次傳球)

我是否將其作爲單個文檔存儲?我是否將事件分成單獨的文檔GameEvents?有第三種情況嗎?

回答

1

將其存儲爲單個對象 - 您定義的結構非常好。然後,爲您將要執行的各種類型的查詢定義索引。不必將事情分解成具有關係的表格,這使得像Raven這樣的文檔數據庫非常棒 - 適用於像您所描述的情景。

+0

如果你使用這種方法,對於大部分統計數據,你最好加載整個文檔(代表1個遊戲),在內存中處理它,然後將其寫回到文檔中。對於橫跨多個遊戲的統計數據,您可能需要查看Map/Reduce – 2012-02-27 17:22:56

+0

Matt這聽起來像個好主意。爲了清楚我是否想計算玩家的通行證,我會加載遊戲文檔,進行計算並再次保存。 – marto 2012-02-27 22:39:55

+0

@Matro,是的,這是想法,雖然有很多這樣做的開銷,所以修補可能會幫助你。 http://ravendb.net/docs/client-api/partial-document-updates – 2012-02-28 00:58:00

3

我不擔心這將如何存儲在RavenDB中。這就是文檔數據庫的美妙之處;不要聯想。以面向對象的方式創建您的領域模型(團隊將有一個列表<球員>屬性等),然後只需要保存實體。

我一直在博客中關於如何在使用RavenDB時保持我的域模型純粹的博客。我需要發佈那...

**編輯** 我終於發佈該博客:http://bit.ly/xUsYJK。這顯示了Presto在使用RavenDB時如何保持某種純粹的域模型。

順便說一句,丹尼爾·蘭有關於這個主題的一個很好的博客:

http://daniellang.net/how-to-handle-relations-in-ravendb/

我使用包含<牛逼>方法,因爲我喜歡讓我的域實體在什麼引用對方我考慮一個適當的方法。

丹尼爾也有一個名爲「反規範您的參考」。有些人更喜歡這種方法。

1

考慮到在遊戲過程中會發生多少這樣的事件,我相信你一定希望將它們作爲單獨的文檔。這樣您就不需要在每個事件進入時加載和更新遊戲文檔,因爲如果文檔變得非常大,這也會非常昂貴。

要獲得遊戲所有事件的統計信息,我寧願有一些索引來收集適當的數據。

+0

這是我原來的想法。帶有事件的遊戲文檔可以增長到大約1MB。如果我將這些事件分開,則它的大小約爲一半,遊戲對象的其餘部分更新頻率較低。唯一的另一件事是,文件將只在整個足球比賽中更新,而不會再次這樣,這就是爲什麼我開始使用一個文檔。 – marto 2012-02-27 22:37:26

+0

有許多文件沒有缺點,所以我沒有看到在遊戲文件中全部集中在一起的觀點。知道你的遊戲文件將是1MB - 這非常重要 - 我肯定會建議爲這些事件提供單獨的文檔,以避免整個遊戲文檔的加載和更新。 – 2012-02-27 23:57:46