【问题标题】:Can I have multiple entries under the same primary key while using DynamoDB?使用 DynamoDB 时,我可以在同一个主键下有多个条目吗?
【发布时间】:2023-04-10 19:41:04
【问题描述】:

我目前正在开发一项技能,将成为股票投资组合经理。 我希望表格有三个标题

  1. 用户 ID(来自 Alexa)
  2. 股票名称
  3. 库存数量

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

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

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

有没有办法使用 DynamoDB 做到这一点?

【问题讨论】:

  • 用户和股票之间是否存在一对多的关系?

标签: node.js amazon-web-services aws-lambda amazon-dynamodb aws-sdk


【解决方案1】:

主键必须是唯一的。您可能需要用户 ID + 股票名称的复合主键。在 DynamoDB 中,通过在主表索引上将 UserID 设置为哈希键,将 Stock Name 设置为排序键来完成。

【讨论】:

    【解决方案2】:

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

    在这个表中,PK 属性是主键,SK - 排序键。

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

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

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

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

    【讨论】:

      【解决方案3】:

      是的,假设您使用来自 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 格式)和属性值。

      【讨论】:

      • 非常感谢,我会试试看的!
      • 另一种选择是主键为 (userId, stockName),其中 userId 是哈希键,stockName 是排序键。然后,您可以通过 userId 查询为用户检索所有股票,并通过 userId 和 stockName 查询每只股票的数量。您也不会受到 400KB 项目限制大小的限制
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2020-10-26
      • 2012-10-31
      • 2017-08-11
      • 2012-09-25
      • 1970-01-01
      相关资源
      最近更新 更多