DynamoDB-为PartitionKey合并两个表属性(列)吗?

时间:2020-05-28 00:39:28

标签: amazon-web-services amazon-dynamodb primary-key

我正在为一个金融应用程序设计我的第一个DynamoDB数据库,在该数据库中,用户创建了几个金融投资组合,其中包含诸如帐户,投资,交易等对象。我对分区键的最佳实践并不百分百清楚。

对于以下用例,我有2个问题:

1。)大多数表由行组成,其中应用程序中的每个用户每个投资组合(帐户,例如投资)将拥有大约10到200个对象。由于我通过userId和PortfolioId加载数据,因此userId是分区键的第一部分。但是,最好为PortfolioId创建排序键,还是应该将其与userId串联?

1.1) PartitionKey: userId, SortKey: portfolioId
or
1.2) PartitionKey: userId + portfolioId

2。)投资组合中的交易每用户数量将大得多,范围在10,000和250,000之间。再说一次,concat会更好吗,特别是考虑到不是所有事务都一次加载,而是仅最近一次(基于transactionDate)加载?

2.1) PartitionKey: userId, SortKey: portfolioId
or
2.2) PartitionKey: userId + portfolioId, SortKey: transactionDate

由于我的get方法将仅获取最新的事务,因此在transactionDate上使用了一个附加过滤器。

->我的理解是1.2和2.2是更好的设计,因为它们应使检索速度更快,同时仍可以在分区之间均匀地分布数据,因为密钥以userId开头,应用程序应具有很多。 任何建议或经验,对此深表感谢!


UPDATE:

我对桌子还不够清楚。有一个投资组合表,您可以通过其中的userId查询所有投资组合,从那里应用程序一次仅加载一个投资组合。

无需查询诸如帐户之类的表上的所有投资组合。既然如此,是1.2和2.2还是不是一个好的模式?

对于带有列的“帐户”表

1.1)
accountId,
userId,        --> PartitionKey
portFolioId,   --> SortKey
accountName,
accountType,
...

1.2)
accountId,
userId + portFolioId, --> PartitionKey
accountName,
accountType,
...

对于“交易”

2.1)
transactionId,
userId,        --> PartitionKey
portFolioId,   --> SortKey
transactionDate,     
amount,
accountSourceId, 
accountTargetId,
...

2.2)
transactionId,
userId + portFolioId, --> PartitionKey
transactionDate,      --> SortKey   
amount,
accountSourceId, 
accountTargetId,
...

1 个答案:

答案 0 :(得分:1)

您肯定要1.1。它允许您对userId执行查询并获取该用户的所有投资组合。 1.2。是反模式,userId没有执行任何有用的功能,您需要userId PortfolioId才能获得项目。在这种情况下,最好只在分区键上使用profolioId。

对于第2部分,您可能想要

分区键:PortfolioId 排序键:transactionId

您可以使用带有PortfolioId的分区键的查询,您将获得该投资组合的最新交易记录。

如果您还需要获取用户的最新交易,请创建具有分区键userId和transactionId的排序键的GSI。

在分区键中组合ID几乎几乎没有任何意义。在排序键中加入ID是有意义的。

相关问题