0

我将以下数据存储在名为 的 DynamoDB 表中elo-history

{
  "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 是否支持类似的东西?我是否需要重组数据或以两种不同的格式保存数据以支持这种类型的查询?

像这样的东西。player-elo-history除表外还调用了新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"
        ]
      }
    ]
  ]
}
4

1 回答 1

1

看起来您正在使用游戏项目上的复杂属性(例如列表或对象)对游戏和结果之间的一对多关系进行建模。这是对一对多关系进行建模的一种完全有效的方法,最适合在 1) 结果数据不更改(或经常更改)和 2) 您对结果没有任何访问模式的情况下使用。

由于听起来您确实具有围绕结果的访问模式,因此最好将结果存储在他们自己的项目中。

例如,您可能会考虑使用 PK=USER#user_id SK=RESULT#game_id 在用户分区中建模结果。这将允许您按用户 ID 获取结果(查询,其中 PK=USER#user_id SK begin_with RESULT)。或者,您可以使用 PK=RESULT#game_id SK=USER#user_id 对结果进行建模,并创建一个交换 PK/SK 的 GSI,这将允许您按用户对结果进行分组。

我不知道您的访问模式的细节,但可以说如果您想支持围绕游戏结果的访问模式,您需要将结果移动到他们自己的项目中。

于 2021-06-13T15:03:24.683 回答