Google cloud firestore Firestore数据库设计:团队vs游戏vs玩家

Google cloud firestore Firestore数据库设计:团队vs游戏vs玩家,google-cloud-firestore,Google Cloud Firestore,我没有Firestore的经验,我有SQL的背景。我使用SQL开发了一个应用程序,看起来效果不错,但我对如何在Firestore的NoSQL方法中复制设计感到困惑 假设我有一支有很多比赛的球队。同一支球队有很多球员。而且每场比赛都有很多球员 现在假设我想存储每场比赛中每个球员的统计数据以及每个球员的累积统计数据 在SQL中,我会将统计数据存储在单独的表中:一个gameResults表(每个游戏的统计数据),并将每个游戏的统计数据添加到players表(累积统计数据) 在Firestore中,我如

我没有Firestore的经验,我有SQL的背景。我使用SQL开发了一个应用程序,看起来效果不错,但我对如何在Firestore的NoSQL方法中复制设计感到困惑

假设我有一支有很多比赛的球队。同一支球队有很多球员。而且每场比赛都有很多球员

现在假设我想存储每场比赛中每个球员的统计数据以及每个球员的累积统计数据

在SQL中,我会将统计数据存储在单独的表中:一个
gameResults
表(每个游戏的统计数据),并将每个游戏的统计数据添加到
players
表(累积统计数据)

在Firestore中,我如何以高效的方式实现同样的目标


我在考虑一个
团队
根集合,以单个团队作为文档,然后为每个团队创建两个兄弟子集合:
游戏
玩家
(后者用于累积玩家统计)。每个
游戏
文档(单个游戏)将有另一个子集合,也称为
玩家
,该子集合将包含每个玩家特定游戏的统计信息。我会将每个玩家的游戏统计数据复制到累积统计数据
players
子集合中。不确定这是否是Firestore中的低效/不适当设置。如果是这样的话,最好的建模方法是什么?

我认为您只需要四个根集合

1) 团队

2) 球员

3) 游戏

4) 玩家状态

Firestore: Firestore是一个NoSQL数据库,@pepe是正确的。对于最佳实践,对于要存储的每种类型的信息,最好都有不同的根集合。然而,我发布这个答案也是为了更详细地说明您的数据库究竟是什么样子,以及数据将如何存储在那里

Firestore的工作原理:

contacts > UNIQUE_ID_01 > Name:   Andrew
                          Sname:  Williams
                          Mobile: 99741258

           UNIQUE_ID_02 > Name:   Margaret
                          Sname:  Smith
                          Mobile: 99451236
Firestore有收藏文档字段

例如,如果您想存储联系人信息,您可以这样做:

收藏:“联系人”>文档:“唯一ID”>字段:姓名:字符串,网名:字符串,手机:号码

数据将按如下方式保存:

contacts > UNIQUE_ID_01 > Name:   Andrew
                          Sname:  Williams
                          Mobile: 99741258

           UNIQUE_ID_02 > Name:   Margaret
                          Sname:  Smith
                          Mobile: 99451236
如您所见,每个联系人都有自己的唯一ID,该ID在创建文档时自动生成,也可以使用API生成。然后,每个文档都是您希望存储的有关此联系人的所有信息

现在,这将帮助您在不希望再次存储相同信息的其他集合中建立关系,只需保存引用的唯一ID。例如,您正在为公司进行集合,哪些联系人在那里工作。公司的子文档中没有一个字段,该字段将再次包含姓名、sname、手机等。您只需将每个联系人的所有唯一ID存储在一个数组字段中。然后,如果您想查找联系人的信息,您可以对每个文档ID进行新的查询,只需获取所需的数据

建筑设计: 首先,建议写下要存储的数据,并指定它们之间的关系:

类型:

contacts > UNIQUE_ID_01 > Name:   Andrew
                          Sname:  Williams
                          Mobile: 99741258

           UNIQUE_ID_02 > Name:   Margaret
                          Sname:  Smith
                          Mobile: 99451236
  • 团队
  • 游戏
  • 球员
您想更新:

contacts > UNIQUE_ID_01 > Name:   Andrew
                          Sname:  Williams
                          Mobile: 99741258

           UNIQUE_ID_02 > Name:   Margaret
                          Sname:  Smith
                          Mobile: 99451236
  • 每个游戏中每个玩家的状态
  • 根据每个玩家玩的所有游戏确定其状态
现在,指定要保存的信息类型将成为根集合

Firestore将如何发展: 集合:“团队”>文档:“唯一团队ID”>字段:标题:字符串,玩家:数组,团队统计信息:编号

收藏:“游戏”>文档:“唯一的游戏ID”>字段:标题:字符串,日期:时间戳,玩家:数组,团队:数组

收藏:“玩家”>文档:“唯一玩家ID”>字段:姓名:字符串,姓氏:字符串,手机:数字,统计所有游戏:数字

Firestore中数据的外观: 因此,我们的想法是将唯一的ID存储在数组中,这样当您查询团队的每个状态时,您将只获得关于团队的数据以及必要的数据,以便在需要时创建新的查询

例如,您可以查询查看日期1576593460之后的所有游戏。当数据作为快照加载时,如果您想获取团队的信息,您有ID,并且可以使用这些ID再次查询以获取团队的信息。如果还需要查看玩家,那么您也可以在检索到的数据中找到所有玩家ID,这样您就可以查询每个玩家的个人数据


这或多或少是我实现这一点的方式。当然,关于如何使用Firestore,还有很多其他选择,甚至可能是更好的实践。但是,如果您喜欢这种方法并更好地理解它,那么您可以用您的逻辑实现它

其他答案似乎已经回答了这个问题。但是,如果您还想拥有python后端,则可以改进查询数据的步骤。请参阅我目前正在开发的中的
会议会话
示例。如果使用
烧瓶锅炉
,后端将处理

您可以查询查看日期1576593460之后的所有游戏。当数据作为快照加载时,如果您想获取团队的信息,您有ID,并且可以使用这些ID再次查询以获取团队的信息。如果还需要查看玩家,那么在检索到的数据中也有所有玩家ID,这样您就可以查看