使用 dynamodb 在嵌套数组值上创建索引
Create index on nested array value with dynamodb
我将以下数据存储在名为 elo-history
的 DynamoDB table 中。
{
"gameId": "chess",
"guildId": "abc123",
"id": "c3c640e2d8b76b034605d8835a03bef8",
"recordedAt": 1621095861673,
"results": [
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
],
"versus": "1v1"
}
我有 2 个索引,guildId-recordedAt-index
和 gameId-recordedAt-index
。这些允许我查询这些字段。
我正在尝试为 results[].playerIds[]
添加另一个索引。我希望能够使用 playerId=abc1
查询记录,并像 guildId 和 gameId 一样对这些记录进行排序。 DynamoDB 是否支持类似的东西?我是否需要重组数据或以两种不同的格式保存数据以支持此类查询?
像这样。
除了 elo-history
table 之外,新的 table 称为 player-elo-history
。这将按 playerId
存储游戏列表
{
"id": "abc1",
"gameId": "chess",
"guildId": "abc123",
"recordedAt": 1621095861673,
"results": [
[
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
]
]
}
{
"id": "abc2",
"gameId": "chess",
"guildId": "abc123",
"recordedAt": 1621095861673,
"results": [
[
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
]
]
}
看起来您正在使用游戏项上的复杂属性(例如列表或对象)对游戏和结果之间的一对多关系进行建模。这是一种完全有效的一对多关系建模方法,最适用于以下情况:1) 结果数据不改变(或经常改变)和 2) 您没有任何关于结果的访问模式。
由于听起来您确实 具有围绕结果的访问模式,您最好将结果存储在它们自己的项目中。
例如,您可能会考虑使用 PK=USER#user_id SK=RESULT#game_id 在用户分区中建模结果。这将允许您通过用户 ID 获取结果(QUERY where PK=USER#user_id SK begins_with RESULT)。或者,您可以使用 PK=RESULT#game_id SK=USER#user_id 对结果建模,并创建一个交换 PK/SK 的 GSI,这样您就可以按用户对结果进行分组。
我不知道您的访问模式的细节,但可以说,如果您想支持游戏结果的访问模式,您需要将结果移动到它们自己的项目中。
我将以下数据存储在名为 elo-history
的 DynamoDB table 中。
{
"gameId": "chess",
"guildId": "abc123",
"id": "c3c640e2d8b76b034605d8835a03bef8",
"recordedAt": 1621095861673,
"results": [
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
],
"versus": "1v1"
}
我有 2 个索引,guildId-recordedAt-index
和 gameId-recordedAt-index
。这些允许我查询这些字段。
我正在尝试为 results[].playerIds[]
添加另一个索引。我希望能够使用 playerId=abc1
查询记录,并像 guildId 和 gameId 一样对这些记录进行排序。 DynamoDB 是否支持类似的东西?我是否需要重组数据或以两种不同的格式保存数据以支持此类查询?
像这样。
除了 elo-history
table 之外,新的 table 称为 player-elo-history
。这将按 playerId
{
"id": "abc1",
"gameId": "chess",
"guildId": "abc123",
"recordedAt": 1621095861673,
"results": [
[
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
]
]
}
{
"id": "abc2",
"gameId": "chess",
"guildId": "abc123",
"recordedAt": 1621095861673,
"results": [
[
{
"oldEloRating": null,
"newEloRating": 2010,
"place": 1,
"playerIds": [
"abc1"
]
},
{
"oldEloRating": null,
"newEloRating": 1990,
"place": 2,
"playerIds": [
"abc2"
]
}
]
]
}
看起来您正在使用游戏项上的复杂属性(例如列表或对象)对游戏和结果之间的一对多关系进行建模。这是一种完全有效的一对多关系建模方法,最适用于以下情况:1) 结果数据不改变(或经常改变)和 2) 您没有任何关于结果的访问模式。
由于听起来您确实 具有围绕结果的访问模式,您最好将结果存储在它们自己的项目中。
例如,您可能会考虑使用 PK=USER#user_id SK=RESULT#game_id 在用户分区中建模结果。这将允许您通过用户 ID 获取结果(QUERY where PK=USER#user_id SK begins_with RESULT)。或者,您可以使用 PK=RESULT#game_id SK=USER#user_id 对结果建模,并创建一个交换 PK/SK 的 GSI,这样您就可以按用户对结果进行分组。
我不知道您的访问模式的细节,但可以说,如果您想支持游戏结果的访问模式,您需要将结果移动到它们自己的项目中。