多人游戏数据模型设计

multiplayer game data model design

这是我的 dynamodb table 设计,用于有两个玩家的处于挂起状态的游戏。游戏状态可以改变形式 pending -> live -> over

PK      SK      State    Name
gid1    state   pending 
gid1    pid1             alex
gid1    pid2             john

现在我想查询特定用户属于哪些未决游戏。为此,我必须将游戏状态复制到每个玩家物品并像这样创建 GSI。

GSIPK   GSISK   PK
alex    pending gid1
john    pending gid1

在我想更新游戏状态之前,此复制工作正常。这意味着我还必须更新所有游戏的用户状态,如果游戏有很多玩家,那可能会很慢而且很贵。

是否有更好的设计来模拟子项依赖于父项属性值的 parent/child 关系?

复制游戏状态似乎没有明显的理由。您可以继续使用当前模型。使用 GSI 查找玩家参与的游戏,然后获取结果集并迭代它们。对于玩家参与的每个游戏,从基础 table 中获取 GameState 项。将每个游戏添加到集合中,集合键为状态。

这是一个额外的步骤,所以代码会多一点,但就数据库吞吐量而言,它的成本非常低。

另一种选择,对我来说似乎更明显,是有两个单独的 table;一种用于游戏玩家,一种用于游戏状态。