我正在为一个金融应用程序设计我的第一个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,
...
答案 0 :(得分:1)
您肯定要1.1。它允许您对userId执行查询并获取该用户的所有投资组合。 1.2。是反模式,userId没有执行任何有用的功能,您需要userId 和 PortfolioId才能获得项目。在这种情况下,最好只在分区键上使用profolioId。
对于第2部分,您可能想要
分区键:PortfolioId 排序键:transactionId
您可以使用带有PortfolioId的分区键的查询,您将获得该投资组合的最新交易记录。
如果您还需要获取用户的最新交易,请创建具有分区键userId和transactionId的排序键的GSI。
在分区键中组合ID几乎几乎没有任何意义。在排序键中加入ID是有意义的。