使用 Amazon DynamoDB 构建可扩展的梦幻足球数据库模型( 三 )


对选择性表查询使用全局二级索引写入分片:
▌使用项目集合
设计的一个原则是将相关数据保存在一起 。这意味着您在 Gamer 下,将关于玩家的(比赛周球员名单) 的信息,与有关 Gamer 实体的重要详细信息存储在一起 。这种使用项目集合预联接数据的技术减少了为提取项目往返查询表的次数,从而缩短了检索时间,但代价是表中的某些数据会重复 。这种技术可用于优化计算,这与关系数据库正好相反,在关系数据库中,您可以联接来自不同表的单独项目以节省存储成本 。在下图中,我们在 GW#(N) 的 SK 值下为Gamer#添加了 ,此处的 GW 表示比赛周(Game Week),N 表示比赛周编号 。请注意比赛周 01 的属性值映射到多个。我们决定不使用称为邻接列表的更高级的技术,原因如后文所述,因为我们想在中一次性添加或删除所有球员,以保持其固定大小限制 。这种设计满足了第二种访问模式:获取某个 Gamer 的。如下图所示,为Gamer#显示了三个项目:一个根项目记录和两个球队名单记录,因此我们可以确定,所有具有PK = Gamer#的项目位于同一个项目集合中 。这种建模技术在一个 PK 下构造项目集合 。当您有这样的表示相关数据的项目集合时,您可以使用查询 API 操作同时检索一个分区键下的多个项目 。
管理多对多关系建模
您可以使用几种策略来对多对多关系建模 。在我们的梦幻足球应用程序数据库示例中,多对多关系的例子包括 - 以及 Gamer- 关系 。
▌使用数据复制
在中,对多对多关系建模的最常用策略之一是复制数据 。在我们的梦幻足球游戏中,适合这种策略的关系的一个很好的例子是 Gamer 与的关系 。这里的一种典型的访问模式是获取玩家的球员名单中的球员 。如下表所示,Gamer 创建的球员名单中包含为每个比赛周选择的。在关系数据库中,您通常会通过创建单独的表来建模,该表使用外键将链接到球员名单 。在中,您可以在 Gamer 实体下复制数据,这使您可以通过单个请求提取某个玩家的球员名单中的所有球员 。使用此策略时,请务必记住,当重复关系中的相关实体数量有限,并且重复的信息不会经常更改或不可变时,此策略最有效 。

使用 Amazon DynamoDB 构建可扩展的梦幻足球数据库模型

文章插图
▌使用邻接列表
在图论中,使用邻接列表来表示多对多关系是用于有限图的常见表示形式 。用术语来说,您可以将实体之间的关系建模为表中的一个项目 。在我们的梦幻足球游戏中,Gamer 和关系可以使用此策略建模 。为此,我们在顶级实体 Gamer 下,为玩家参加的每个联赛创建一个项目 。
通过这个模型,我们可以提取任何给定玩家参加的所有联赛,如以下架构所示 。
为了使用PK = # 通过单个请求让玩家在某个联赛中玩游戏,我们可以添加一个名为 GSI2 的 GSI,其中 # 是分区键(上表中未显示) 。在 GSI 中,我们的分区键的值是#,排序键的值是 。在应用程序中,我们必须确保和 Gamer 的键与 GSI2 主键保持同步 。为了满足第五种访问模式(获取给定的所有 Gamer,按照排序),我们可以使用分区键查询给定联赛,获取联赛中按照排序的所有玩家,无需在客户端排序 。
访问模式和查询映射
在建模练习结束时,使用示例查询条件以及用于满足访问模式的表或二级索引键更新访问模式表 。
结论
在本文中,您学习了设计可扩展数据模型的方法,该模型用于在中存储梦幻足球的游戏比赛数据 。您还了观看了我们如何应用技术的演练,例如非规范化、每个索引多个实体类型以及邻接列表,以便根据要求将数据访问模式映射到表和索引,从而为应用程序提供服务 。有关上游戏设计模式的更多深入信息,请参阅 toon ( 上的可扩展游戏模式简介) 。此外,有关在上开发游戏的其他资源,请参阅 for Games 。