2012-02-27 94 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