我目前正在开发一种技能,该技能将成为股票投资组合经理。 我希望表格具有三个标题
UserID是主键,当前我可以向表中添加一定数量的库存,然后在名为GetPortfolioValue的单独方法中查询数据库以返回特定UserID的库存名称和库存量,我将然后做一些数学运算以返回投资组合值。
问题是,我不能在主键下添加另一个条目,因此投资组合中只能有一个股票期权,这很糟糕
我希望以后可以编辑投资组合,以防用户出售部分股票。
是否可以使用DynamoDB做到这一点?
答案 0 :(得分:2)
主键必须唯一。您可能需要用户ID +股票名称的复合主键。在DynamoDB中,可以通过在主表索引上将UserID设置为哈希键,将Stock Name设置为排序键来实现。
答案 1 :(得分:1)
当表具有排序键时,您可以拥有多个具有相同主键的项目。如果表只有主键没有排序键 - 那么没有。如果表有排序键,那么每个主键和排序键组合必须是唯一的。
本表中,PK属性为主键,SK-排序键。
然而,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中)和属性值。