我正在为一个金融应用程序设计我的第一个DynamoDB数据库,在该数据库中,用户创建了多个金融投资组合,其中包含诸如帐户,投资,交易等对象。我对分区键的最佳做法并不百分百清楚。
我对以下用例有两个问题:
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,
...
和
PortfolioId才能获得项目。在这种情况下,最好在分区键上使用profolioId。