为了在 Dynamo DB 中表示多对多关系,我经常看到两种方法:全局二级索引 (GSI) 和邻接列表。现在我的问题是,什么时候使用哪个?
GSI 的使用基本上是指翻转分区键和排序键,以便在这两种情况下都可以有效地查询数据。示例显示类似 Online Game with Players 之类的内容,例如
Players table
--------------
Partition | Sort
-----------------
Player 1 | Game 1
Player 1 | Game 2
Player 2 | Game 1
Player 3 | Game 2
Games GSI
-----------
Partition | Sort
-----------------
Game 1 | Player 2
Game 1 | Player 2
Game 2 | Player 1
Game 2 | Player 3
我假设这些都是同一游戏平台内的所有会话,即与有限数量的玩家匹配。
这一切似乎都是直截了当且合乎逻辑的实现......直到数据变得更加复杂。如果 Players 和 Games 都有自己的属性集怎么办?假设一个游戏具有启动时间的属性,而玩家具有诸如用户名和个人游戏分数之类的属性。这些如何投影到 Table 和 GSI 上?
例如,所需的预测将是这样的
让玩家参与游戏
// query made with game id
{
start_date: '2018-11-04T13:00Z',
status: 'IN_PROGRESS',
players: [
{
username: 'starkshark',
points: 200
},
{
username: 'coldshot',
points 300
}
]
}
获取玩家参与的游戏
// query made with player id
{
username: 'starkshark',
games: [
{
status: 'IN_PROGRESS',
start_date: '....'
},
{
status: 'ENDED',
start_date: '...',
end_date: '...'
}
]
}
或者这是需要使用邻接列表模式的边界情况?从我读过的关于邻接列表的一般情况来看,实现简单的多对多关系似乎相当复杂,就像上面的在线游戏示例一样。我的理解是,它旨在对具有多个相互链接的节点的图形进行建模。当然,在这种情况下,节点将是 Games 和 Players(可能还有模型中需要的任何其他实体)
TLDR:所以归结为最后一个问题,当实体之间具有多对多关系时,具有自己的一组属性,邻接表是要查找的选项,还是模型的数据结构不那么复杂?