多人游戏数据模型设计
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;一种用于游戏玩家,一种用于游戏状态。
这是我的 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;一种用于游戏玩家,一种用于游戏状态。