【问题标题】:getting the right data model with dynamodb使用 dynamodb 获得正确的数据模型
【发布时间】:2017-09-18 17:55:46
【问题描述】:

我即将创建我的第一个 dynamodb 表,但找不到合适的解决方案来模拟我的需求。这听起来很基础,但可能我的大脑仍然对关系数据库世界太感兴趣了。

我想存储类似的东西:

用户可以购买产品(一次或多次)。我要存储的是usernameproduct_id

我稍后需要查询的唯一内容是:

  • 用户X购买了哪些产品
  • 他们购买了多少次

首先,我考虑拥有一个具有两个属性的项目:usernameproduct_id。但是我不能使用username作为主键(用户可以购买多次)我也不能使用username + product_id(用户可以多次购买产品)

现在我会选择 usernameproduct_idcounter 并以 username + product_id 作为主键。但是,我总是需要先检查产品是否已经购买并更新,否则创建一个新条目。为了获取用户的所有产品,我将在 username 上创建一个全局二级索引。

但是,我不太确定这是否是正确的方法。任何反馈都会很棒!

【问题讨论】:

    标签: amazon-dynamodb boto nosql


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢分享您的想法!不幸的是,在我的情况下没有可用的订单 ID。由于我的唯一要求是上述要求,因此我找到了一种更简单的建模方法:username 作为主键,product_ids 作为已购买的所有产品的列表。
    • garnaat 是对的。如果您没有订单 ID,它仍然可以。只需使用用户名作为主键,product_id 作为范围键。
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2018-12-05
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多