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

时间:2019-01-08 15:23:51

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

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

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

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

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

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

是否可以使用DynamoDB做到这一点?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

enter image description here

本表中,PK属性为主键,SK-排序键。

enter image description here

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

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

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

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

答案 2 :(得分:0)

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