DynamoDB - 合并分区键的两个表属性(列)?



我正在为一个金融应用程序设计我的第一个 DynamoDB 数据库,用户可以在其中创建多个金融投资组合,其中包含账户、投资、交易等对象。我不是 100% 清楚分区键的最佳实践。

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

1.( 大多数表格由行组成,其中应用程序中的每个用户每个投资组合(账户,例如投资(将有大约 10 到 200 个对象。由于我按用户 ID 和 portfolioID 加载数据,因此用户 ID 是分区键的第一部分。但是,是为 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.1。它允许您对 userId 执行查询并获取该用户的所有投资组合。1.2. 是一个反模式,userId 没有执行任何有用的功能,你需要 userIdportfolioId 来获取一个项目。在这种情况下,最好只是在分区键中使用 profolioId。

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

分区键:投资组合 ID 排序键:事务 ID

可以使用 portfolioId 的分区键执行查询,您将获得该投资组合的最新事务。

如果还需要获取用户的最新事务,请使用分区键 userId 和事务 ID 的排序键创建 GSI。

在分区键中组合到 Id 几乎毫无意义。在排序键中联接 ID 是有意义的。

最新更新