Rest 使用DynamoDB对具有身份验证的分层数据建模

Rest 使用DynamoDB对具有身份验证的分层数据建模,rest,authentication,database-design,amazon-dynamodb,data-modeling,Rest,Authentication,Database Design,Amazon Dynamodb,Data Modeling,我正在寻找一些最佳实践,在一般情况下,尤其是在使用DynamoDB建模机密层次数据时 最好用一个示例来解释该场景: 假设我们有许多用户。每个用户都有许多产品。每个产品由许多部分组成 典型用例: 列出给定用户的所有产品 列出给定产品的所有零件 到目前为止,我在DynamoDB中对此进行了如下建模: Users ---------------- HashKey: UserId Products ------------------- HashKey: UserId RangeKey: P

我正在寻找一些最佳实践,在一般情况下,尤其是在使用DynamoDB建模机密层次数据时

最好用一个示例来解释该场景: 假设我们有许多
用户
。每个
用户
都有许多
产品
。每个
产品
由许多
部分组成

典型用例:

  • 列出给定
    用户的所有
    产品
  • 列出给定
    产品的所有
    零件
到目前为止,我在DynamoDB中对此进行了如下建模:

Users
----------------
HashKey:  UserId


Products
-------------------
HashKey:  UserId
RangeKey: ProductId


Parts
-------------------
HashKey:  ProductId
RangeKey: PartId
数据是保密的,通过经过身份验证的REST端点访问,其中身份验证令牌可以映射到
用户ID
。允许每个用户通过某些组概念查看其他用户的数据

列出给定用户的所有产品很简单,因为
UserId
是products表中的一个键:

GET/users/111/products
成为一个简单的
查询(Table=products,UserId=111)

但是考虑一个给定产品的所有零件的列表的情况:

GET/users/111/products/222/parts

如果我只是做一个
查询(Table=Parts,ProductId=222)
,那么我将快速获得所需的数据,但我不会阻止其他用户查询属于用户111的数据,前提是他们不知何故知道
ProductId
222(实际上,ID:s当然是UUID:s或类似的,因此不容易猜测):

GET/users/119/products/222/parts

。。。将导致恶意用户119检索不属于他的数据,前提是不采取任何措施来解决此问题。 所以在这里我想我需要做一些像这样的事情:

  • 首先进行另一个查询,以确保产品222实际上属于给定用户
  • 复制零件表中的
    UserId
    ,并将其包含在查询条件中(这基本上意味着在扫描由
    ProductId
    标识的集合时,它将匹配所有行或无行):
    query(table=Parts,ProductId=222,UserId=111)
  • 在Parts表中也使用UserId作为散列键,并将ProductId保留为辅助索引
  • 零件
    表上使用复合哈希键,如
    用户ID\u产品ID
    (“111\u 222”)
  • 如果我需要返回401而不是空数据,那么选项1似乎是唯一的方法。但如果我们设想一个更深层次的数据,例如“用户有收件箱,邮件有附件”,那么这种方法最终可能会很昂贵(列出P部分的所有附件可能会导致查询,以检查P部分是否属于邮件M,邮件M是否属于收件箱I,收件箱I是否属于用户U,依此类推)

    有没有人对哪种方法最有利有什么好的论据?或者我是在做一些愚蠢的事情,应该以其他方式完全建模我的数据