我正在使用dynamo db存储客户发票,其中每个发票都有自己的唯一标识符,称为invoiceId
。
我的阅读操作主要是为某个客户获取发票。
1-如果我将invoiceId
用作分区键,则同一客户端的发票可能会写入不同的分区。 这个假设正确吗?如果我应该担心的话?
2-另一种情况是使用客户端ID作为分配关键字(尽可能将分区中同一客户端的发票分组),并使用invoiceId作为排序关键字。 是正确的方法还是有更好的方法来处理这种情况?
我来自关系数据库的背景,在一个组件冗余的情况下使用复合主键似乎很奇怪。
答案 0 :(得分:1)
第1点:假设正确
要点2:这不是最佳方法,因为Dynamodb仅允许对分区键执行查询操作。如果您不知道分区键,则需要扫描(昂贵的操作-不推荐)表或创建GSI。
我建议的解决方案:-
由于您的用例需要按发票编号获取数据,因此Invoice id
为
分区键是最好的方法。
发票ID-分区键
如果您还有另一个用例来获取client id
的所有发票,则可以使用
客户端ID-分区键
发票ID-排序键
重要说明:-
在DynamoDB表中,每个键值必须唯一。但是,关键 全局二级索引中的值不必唯一。
您可以针对您的用例分别查询主表和GSI。有关更多详细信息,请阅读有关GSI的信息。
另一个要点,GSI将花费。仅在有用例的情况下创建GSI。