我即将创建我的第一个dynamodb表,但找不到合适的解决方案来模拟我的需求。这听起来很基本,但可能我的大脑仍然过多地关系到数据库世界。
我想存储类似的东西:
用户可以购买产品(一次或多次)。我要存储的内容是username
,product_id
我以后需要查询的唯一内容是:
X
首先,我考虑过拥有一个包含两个属性的项目:username
和product_id
。但是我不能使用username
作为主键(用户可以多次购买)我也不能username
+ product_id
(用户可以多次购买产品)
现在,我会选择username
,product_id
,counter
并将username
+ product_id
作为主键。但是,我将始终首先检查产品是否已购买并更新,否则创建一个新条目。要获取用户的所有产品,我将在username
上创建一个全局二级索引。
但是,我不确定这是否正确。任何反馈都会很棒!
答案 0 :(得分:1)
可能有多种方法可以做到这一点,而且我不了解您的所有要求,因此我无法保证这是您的正确答案,但根据您的说明,这就是我的意思会做的。
首先,我假设每个订单都有某种与之相关的唯一订单号。我会使用此订单号作为表的主键。我不会使用范围键。这将确保满足所有主键唯一的约束。另外,当我将数据写入DynamoDB时,我还会将用户名和product_id写为附加属性。
接下来,我将创建一个全局二级索引,该索引使用用户名作为主键,product_id作为范围键。与表的主键不同,GSI键不必是唯一的,因此如果用户不止一次购买了特定产品,那就没问题了。这个GSI允许我执行查询,例如"按用户名查找所有订单"或者"查找用户名购买的所有订单product_id"。
如果您还需要执行&#34之类的查询,请找到购买了product_id"的所有用户名。你需要另一个使用product_id作为主键和用户名作为范围键的GSI。