DynamoDB主键和索引表设计

时间:2015-10-28 13:06:37

标签: database amazon-web-services amazon-dynamodb

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

  • SubscriptionID
  • CompanyID
  • 开始日期
  • 结束日期
  • 的ProductID

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

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

  1. 能够查询给定公司的有效订阅。也就是说,按CompanyID查询并将StartDateEndDate与给定日期进行比较
  2. 与上述相同,只是查询某个公司是否有特定ProductID的有效订阅
  3. 在将来(或现在),我希望能够查询给定ProductID的所有有效订阅。我最初的计划是使用SubscriptionID作为哈希键,使用CompanyID作为范围键,以便有效查询给定公司的订阅。但是,我不确定是否可以单独查询范围键?我知道散列键和范围键的组合是唯一的(复合键),但在执行范围键的查找时是否总是需要包含散列键?

    我还在考虑为StartDateEndDate制作本地二级索引,以便有效地查询给定公司的有效订阅,但我不确定是否应该将这些全局二级索引改为我想查询所有有效订阅(适用于所有公司)?我的猜测是肯定的,因为我需要查询所有分区而不仅仅是单个公司的分区。

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

    我知道很多这些东西都有记录,但我很难在这个场景中使用这些信息。我希望有人能提供帮助。 所以:您如何设计表格以支持我列出的查询以及原因?

1 个答案:

答案 0 :(得分: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控制台中相当快速地尝试所有这些。我在撰写本文时建议使用beta console,因为它允许您向查询添加过滤器,而生产控制台似乎只允许扫描过滤器。

enter image description here