Amazon dynamodb 使用dynamodb获得正确的数据模型

Amazon dynamodb 使用dynamodb获得正确的数据模型,amazon-dynamodb,boto,nosql,Amazon Dynamodb,Boto,Nosql,我即将创建我的第一个dynamodb表,但找不到合适的解决方案来建模我的需求。这听起来很基本,但可能我的大脑还是太过关注关系数据库世界了 我想做类似的事情: 用户可以购买产品(一次或多次)。我要存储的是username,product\u id 我以后只需要查询以下内容: 用户购买了哪些产品X 购买了多少次 首先,我考虑使用一个具有两个属性的项:username和product\u id。但是我不能使用用户名作为主键(用户可以多次购买),我也不能使用用户名+产品id(用户可以多次购买产品)

我即将创建我的第一个dynamodb表,但找不到合适的解决方案来建模我的需求。这听起来很基本,但可能我的大脑还是太过关注关系数据库世界了

我想做类似的事情:

用户可以购买产品(一次或多次)。我要存储的是
username
product\u id

我以后只需要查询以下内容:

  • 用户购买了哪些产品
    X
  • 购买了多少次
首先,我考虑使用一个具有两个属性的项:
username
product\u id
。但是我不能使用
用户名
作为主键(用户可以多次购买),我也不能使用
用户名
+
产品id
(用户可以多次购买产品)

现在,我将使用
用户名
产品id
计数器
,并将
用户名
+
产品id
作为主键。但是,我总是需要首先检查产品是否已经购买并更新,否则创建一个新条目。为了获得用户的所有产品,我将在
username
上创建一个全局二级索引


不过,我不太确定这是否正确。任何反馈都会很好

可能有很多方法可以做到这一点,我不知道您的所有要求,所以我不能保证这是您的正确答案,但根据您的描述,我会这么做

首先,我假设每个订单都有某种与之相关联的唯一订单号。我将使用此订单号作为表的主键。我不会用范围键。这将确保满足所有主键都是唯一的约束。此外,当我将数据写入DynamoDB时,我还会将用户名和产品标识作为附加属性写入

接下来,我将创建一个全局二级索引,该索引使用用户名作为主键,使用product_id作为范围键。与表的主键不同,GSI键不必是唯一的,因此如果用户多次购买某个特定产品,就可以了。此GSI允许我执行查询,如“按用户名查找所有订单”或“查找用户名购买产品的所有订单”


如果您还需要执行诸如“查找购买产品id的所有用户名”之类的查询,则需要另一个GSI,该GSI使用产品id作为主键,用户名作为范围键。

感谢您分享您的想法!不幸的是,在我的案例中没有可用的订单ID。由于我唯一的需求是上面的需求,我找到了一种更简单的建模方法:
username
作为主键,
product\u id
作为所有已购买产品的列表。garnaat是正确的。如果您没有订单id,它仍然可以。只需将用户名用作主键,将product_id用作范围键即可。