DynamoDB主键和索引表设计

And*_*708 4 database amazon-web-services amazon-dynamodb

我试图围绕如何在DynamoDB中设计表格.我需要一个Subscription表来存储公司每个订阅的项目.所以我计划了以下属性.

  • SubscriptionID
  • CompanyID
  • 开始日期
  • 结束日期
  • 产品ID

我已经阅读了很多关于索引在DynamoDB中如何在二级索引方面工作的内容,但我真的很难理解这一切.似乎我读的越多,我就越困惑.我理解全局二级索引和本地二级索引的核心概念以及哈希键+范围键.问题是将它们放在一起并设计一个支持我的查询要求的表.

截至目前,我有以下查询要求:

  1. 能够查询给定公司的活动订阅.也就是说,通过查询CompanyID和比较StartDate,并EndDate给定日期
  2. 与上述相同,除了查询给定公司是否具有特定的有效订阅 ProductID

在将来(或现在),我希望能够查询给定的所有活动订阅ProductID.我最初的计划是使用SubscriptionID散列键和CompanyID作为范围键来有效查询给定公司的订阅.但是,我不确定是否可以单独查询范围键?我知道散列键和范围键的组合是唯一的(复合键),但在执行范围键的查找时是否总是需要包含散列键?

我也在考虑制作本地二级索引StartDateEndDate有效地查询给定公司的活动订阅,但我不确定是否应该创建这些全局二级索引,而不是当我想查询所有活动订阅时(对于所有活动订阅)公司)?我的猜测是肯定的,因为我需要查询所有分区,而不仅仅是单个公司的分区.

就像我提到的那样,我对这些概念有了基本的了解,但我的斗争是在查询表/索引以及哪些查询模式时,主键和全局/本地二级索引的每个组合都成为可能/不可能.我发现很难掌握键值存储与二级索引提供的附加功能的组合.如果有人能给我一个如何设计表并解释原因的例子,比如各种选择如何支持我的特定查询要求,我真的很乐意.

我知道很多这些东西都有记录,但我很难在这种情况下使用这些信息.我希望有人能提供帮助.那么:你将如何设计表来支持我列出的查询以及为什么?

jar*_*mod 6

给出一些假设,这是一个提案:

  • 假设订阅ID是全球唯一的
  • 假设您需要能够根据其订阅ID检索订阅
  • 假设日期可以表示为数字(例如Julian Day Number)

表设计:

  • 哈希键:SubscriptionID
  • 其他属性CompanyID:S,StartDate:N,EndDate:N,ProductID:S

全球二级指数:

  • ProductID-StartDate-Index:ProductID上的哈希值,StartDate上的范围
  • CompanyID-ProductID-index:CompanyID上的哈希值,ProductID上的范围
  • CompanyID-StartDate-index:CompanyID上的哈希值,StartDate上的范围

查询:

  • 公司查询给定日期的活动订阅:使用CompanyID-StartDate-index,查询CompanyID = :companyid, StartDate <= :date,添加过滤器EndDate >= :date

  • 公司查询给定日期的给定产品的有效订阅:使用CompanyID-ProductID-index,查询CompanyID = :companyid, ProductID = :productid,添加过滤器StartDate <= :date,添加过滤器EndDate >= :date

  • 查询给定日期的给定产品的活动订阅:使用ProductID-StartDate-index,查询ProductID = :productid, StartDate <= :date,添加过滤器EndDate >= :date

您可以在AWS DynamoDB控制台中相当快速地尝试所有这些.我在撰写本文时建议使用测试版控制台,因为它允许您向查询添加过滤器,而生产控制台似乎只允许在扫描时使用过滤器.

在此输入图像描述