Database DynamoDB主键和索引表设计
我正试着思考我应该如何在DynamoDB中设计一张桌子。我需要一个Database DynamoDB主键和索引表设计,database,amazon-web-services,amazon-dynamodb,Database,Amazon Web Services,Amazon Dynamodb,我正试着思考我应该如何在DynamoDB中设计一张桌子。我需要一个Subscription表,用于存储公司的每个订阅的项目。因此,我计划使用以下属性 订阅ID 公司ID 起始日期 结束日期 产品ID 我已经读了很多关于DynamoDB中二级索引的索引工作原理的书,但是我真的很难理解这一切。似乎我读得越多,就越困惑。我了解全局二级索引和本地二级索引以及哈希键+范围键的核心概念。问题在于将所有这些放在一起,并设计一个支持我的查询需求的表 到目前为止,我有以下查询要求: 能够查询给定公司的活动订阅
Subscription
表,用于存储公司的每个订阅的项目。因此,我计划使用以下属性
- 订阅ID
- 公司ID
- 起始日期
- 结束日期
- 产品ID
CompanyID
查询,并将StartDate
和EndDate
与给定日期进行比较ProductID
ProductID
的所有活动订阅。我最初的计划是使用SubscriptionID
作为散列键,将CompanyID
作为范围键,以便高效查询给定公司的订阅。但是,我不确定是否可以单独查询范围键?我知道散列键和范围键的组合是唯一的(复合键),但在执行范围键的查找时是否总是需要包含散列键
我还想为StartDate
和EndDate
创建本地二级索引,以便高效地查询给定公司的活动订阅,但我不确定是否应该在我要查询所有活动订阅(所有公司)时创建这些全局二级索引?我的猜测是肯定的,因为我需要查询所有分区,而不仅仅是单个公司的分区
正如我提到的,我对这些概念有一个基本的理解,但我的困难在于查询表/索引以及主键和全局/本地二级索引的每个组合使哪些查询模式成为可能/不可能。我发现很难掌握键值存储与辅助索引提供的附加功能的结合。如果有人能给我举个例子,说明他们将如何设计表并解释为什么,比如各种选择如何支持我的特定查询需求,我会非常高兴
我知道很多东西都有文档记录,但我很难将这些信息用于这个场景。我希望任何人都能帮忙那么:您将如何设计表格来支持我列出的查询?为什么?考虑到一些假设,这里有一个建议:
- 假设订阅ID是全局唯一的
- 假设您需要能够检索给定订阅ID的订阅
- 假设日期可以表示为数字(例如朱利安日数)
- 哈希键:SubscriptionID
- 其他属性CompanyID:S,StartDate:N,EndDate:N,ProductID:S
- ProductID StartDate索引:ProductID上的哈希,StartDate上的范围
- CompanyID ProductID索引:CompanyID上的哈希,ProductID上的范围
- CompanyID StartDate索引:CompanyID上的哈希,StartDate上的范围
- 按公司查询给定日期的活动订阅:使用CompanyID StartDate索引,查询
CompanyID=:CompanyID,StartDate=:date
- 按公司查询给定日期的给定产品的活动订阅:使用CompanyID ProductID索引,查询
,添加筛选器CompanyID=:CompanyID,ProductID=:ProductID
StartDate=:date
- 在给定日期查询给定产品的活动订阅:使用ProductID StartDate索引,查询
ProductID=:ProductID,StartDate=:date
大家好,我有几个澄清问题:SubscriptionID是否全球唯一?每个公司最多有多少订阅(rom)?根据您的查询需求,您是否确定DynamoDB与SQL RDBMS相比是正确的选择(您是否有充分的理由使用Dynamo)?@jarmod Yes,
SubscriptionID
是全局唯一的。每个公司不会有这么多订阅;最多几百个,但那将是非常罕见的。当然,我可以在关系数据库中实现这一点,现在您已经提到了,这可能是一个不错的选择。然而,我的困惑仍然适用于许多类似的用例,其中使用NoSQL数据库更合适。因此,我将非常感谢任何建议和清除我的困惑。谢谢我询问每个公司的订阅数量的原因是,为了让您查询在给定日期处于活动状态的给定公司的订阅,您必须使用GSI查询(:companyid=companyid和:date>=StartDate),但您还需要应用额外的服务器端筛选器(:date@jarmod啊,这很有道理!在这种情况下,这肯定不会是一个问题,而是一个很好的观察结果。我不知道这个限制,所以感谢您指出!我在文档中没有看到任何地方提到它,但您可能无论如何都是对的。:-)这是一个很棒的答案,非常感谢!你添加的索引是有意义的;我想我只是有点抗拒添加这么多GSI,并想知道这是否是正确的方法。我看到的唯一问题是l