使用 DynamoDB 时,我可以在同一个主键下有多个条目吗?
Can I have multiple entries under the same primary key while using DynamoDB?
我目前正在培养一项将成为股票投资组合经理的技能。
我希望 table 有三个标题
- UserID(来自 Alexa)
- 股票名称
- 库存量
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。
我目前正在培养一项将成为股票投资组合经理的技能。 我希望 table 有三个标题
- UserID(来自 Alexa)
- 股票名称
- 库存量
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。