Data modeling 如何在RavenDB中建立足球比赛统计模型

Data modeling 如何在RavenDB中建立足球比赛统计模型,data-modeling,ravendb,Data Modeling,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

我是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?有第三种情况吗?

将其存储为单个对象-您定义的结构非常好。然后,只需为您将要执行的各种类型的查询定义索引。不必将事物分解为具有关系的表是Raven之类的文档数据库的精髓所在—非常适合您所描述的场景。

将其存储为单个对象—您定义的结构非常棒。然后,只需为您将要执行的各种类型的查询定义索引。不必用关系将事物分解成表,这使像Raven这样的文档数据库非常棒——非常适合您所描述的场景。

我不担心它将如何存储在RavenDB中。这就是文档数据库的美妙之处;不要用关系思维。以应该创建的面向对象方式创建域模型(团队将具有列表属性等),然后根据需要保存实体

我一直想在博客上写我在使用RavenDB时如何保持域模型的纯净。我需要发布那个

**编辑** 我终于发布了那个博客:。这显示了Presto在使用RavenDB时是如何保持一个稍微纯粹的域模型的

顺便说一下,Daniel Lang有一个关于这个主题的好博客:

我使用包含方法,因为我喜欢让我的域实体以我认为适当的方式互相引用。


Daniel还有一个叫做“反规范化您的引用”的部分。有些人更喜欢这种方法。

我不担心它将如何存储在RavenDB中。这就是文档数据库的美妙之处;不要用关系思维。以应该创建的面向对象方式创建域模型(团队将具有列表属性等),然后根据需要保存实体

我一直想在博客上写我在使用RavenDB时如何保持域模型的纯净。我需要发布那个

**编辑** 我终于发布了那个博客:。这显示了Presto在使用RavenDB时是如何保持一个稍微纯粹的域模型的

顺便说一下,Daniel Lang有一个关于这个主题的好博客:

我使用包含方法,因为我喜欢让我的域实体以我认为适当的方式互相引用。


Daniel还有一个叫做“取消引用规范化”的部分。有些人更喜欢这种方法。

考虑到在一场比赛中会发生多少这样的事件,我相信你肯定希望它们作为单独的文档。这样一来,你就不需要在每次活动中加载和更新游戏文档,因为如果文档变得非常大,这也会非常昂贵


为了获得游戏中所有事件的统计数据,我宁愿使用一些索引来收集适当的数据

考虑到在一场比赛中可能会发生多少这样的事件,我相信你肯定希望将它们作为单独的文档。这样一来,你就不需要在每次活动中加载和更新游戏文档,因为如果文档变得非常大,这也会非常昂贵


为了获得游戏中所有事件的统计数据,我宁愿使用一些索引来收集适当的数据

如果使用这种方法,对于大多数统计数据,最好加载整个文档(代表一个游戏),在内存中处理,然后将其写回文档。对于跨多个游戏的统计数据,您可能希望查看Map/ReduceMatt,这听起来是个好主意。为了弄清楚,如果我想为一名球员计算传球,我会加载游戏文档,进行计算,然后再次保存。@Matro,是的,这是一个想法,尽管多次这样做会有一些开销,所以修补可能会帮到你。如果使用这种方法,对于大多数统计数据,最好加载整个文档(代表一个游戏),在内存中处理,然后将其写回文档。对于跨多个游戏的统计数据,您可能希望查看Map/ReduceMatt,这听起来是个好主意。为了弄清楚,如果我想为一名球员计算传球,我会加载游戏文档,进行计算,然后再次保存。@Matro,是的,这是一个想法,尽管多次这样做会有一些开销,所以修补可能会帮到你。这是我最初的想法。一个包含事件的游戏文档大小可以增加到1MB左右。如果我将事件分开,它的大小大约是游戏对象的一半,而游戏对象的其余部分更新的频率较低。唯一的另一件事是,文档只会在整个足球比赛期间更新,不会再更新,所以我从一个文档开始。有很多文档没有缺点,所以我不认为将所有文档都放在游戏文档中有什么意义。知道你的游戏文档将是1MB——这几乎是一样的——我肯定会建议为这些事件提供单独的文档,以避免整个游戏文档的加载和更新。这是我最初的想法。一个包含事件的游戏文档大小可以增加到1MB左右。如果我将事件分开,它的大小大约是游戏对象的一半,而游戏对象的其余部分更新的频率较低。唯一的另一件事是,文档只会在整个足球比赛期间更新,不会再更新,所以我从一个文档开始。有很多文档没有缺点,所以我不认为havi有什么意义