使用 DynamoDB 时,我可以在同一个主键下有多个条目吗?

Can I have multiple entries under the same primary key while using DynamoDB?

我目前正在培养一项将成为股票投资组合经理的技能。 我希望 table 有三个标题

  1. UserID(来自 Alexa)
  2. 股票名称
  3. 库存量

UserID 是主键,目前我可以将一定数量的股票添加到 table,然后在一个名为 GetPortfolioValue 的单独方法中,我查询数据库以 return 股票名称和特定 UserID 的股票数量,然后我将对 return 投资组合值进行一些数学计算。

问题是,我无法在主键下添加另一个条目,因此投资组合中只能有一个股票期权,这很糟糕

我希望以后能够编辑投资组合,以防用户出售部分股票。

有什么方法可以使用 DynamoDB 做到这一点吗?

主键必须是唯一的。您可能需要 UserID + Stock Name 的复合主键。在 DynamoDB 中,这是通过在主 table 索引上将 UserID 设置为散列键并将 Stock Name 设置为排序键来实现的。

是的,假设您使用来自 Alexa 请求的 userId,它们将为您的 dynamoDB 数据库提供一个极好的主键。

"user": {
  "userId": "amzn1.ask.account.[unique-value-here]",

只需将股票存储为针对每个用户的 JSON 对象。

{
  "stocks": [
    {
      "stockAmount": 45,
      "stockName": "AMZN"
    }
  ]
}

存储对象

DynamoDB dynamo = new DynamoDB(new AmazonDynamoDBClient(...)); 
Table stocks = dynamo.getTable("stocks");

String json = {"stocks": [{"stockAmount": 45,"stockName": "AMZN"}]}

Item item =
  new Item()
      .withPrimaryKey("alexa_id", 1)
      .withJSON("document", json);

table.putItem(item);

以及如何找回它

DynamoDB dynamo = new DynamoDB(new AmazonDynamoDBClient(...)); 
Table table = dynamo.getTable("stocks"); 

Item documentItem =
  table.getItem(new GetItemSpec()
                .withPrimaryKey("alexa_id", 1)
                .withAttributesToGet("document"));

System.out.println(documentItem.getJSONPretty("document"));

当您的用户添加或删除股票时,您需要为用户追加到股票数组。您的每个 DynamoDB 项目将受到 400KB 的限制。给定项目的大小包括属性名称(UTF-8 格式)和属性值。

当 table 有排序键时,您 可以 有多个具有相同主键的项目。如果 table 只有主键而没有排序键 - 那么没有。如果 table 有排序键,则每个主键和排序键组合必须是唯一的。

在此table中,PK属性为主键,SK - 排序键。

然而,PK 将在物理上放在一起,不应该有像“active”和“not_active”这样的 PK,而该行项目只有 2 个可能的值,并且所有这些值都将落入 only 2 个空格。如果您将有很多行具有相同的主键,则会为查询创建热点,并且您可能会遇到缓慢的查询。但讨论如何设计 DynamoDB 的话题太宽泛了 table.

您可能会从我的文章中受益:https://lukasliesis.medium.com/learning-from-aws-fcb0cc71926b

Rick Houlihan 在 DynamoDB 架构中提到了两个精彩的视频:

我强烈建议多看两遍,以了解 DynamoDB 的思维方式、了解查询热图、如何将所有应用程序放入单个应用程序 table 并充分利用 DynamoDB。