Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database DynamoDB主键和索引表设计_Database_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

Database DynamoDB主键和索引表设计

Database DynamoDB主键和索引表设计,database,amazon-web-services,amazon-dynamodb,Database,Amazon Web Services,Amazon Dynamodb,我正试着思考我应该如何在DynamoDB中设计一张桌子。我需要一个Subscription表,用于存储公司的每个订阅的项目。因此,我计划使用以下属性 订阅ID 公司ID 起始日期 结束日期 产品ID 我已经读了很多关于DynamoDB中二级索引的索引工作原理的书,但是我真的很难理解这一切。似乎我读得越多,就越困惑。我了解全局二级索引和本地二级索引以及哈希键+范围键的核心概念。问题在于将所有这些放在一起,并设计一个支持我的查询需求的表 到目前为止,我有以下查询要求: 能够查询给定公司的活动订阅

我正试着思考我应该如何在DynamoDB中设计一张桌子。我需要一个
Subscription
表,用于存储公司的每个订阅的项目。因此,我计划使用以下属性

  • 订阅ID
  • 公司ID
  • 起始日期
  • 结束日期
  • 产品ID
我已经读了很多关于DynamoDB中二级索引的索引工作原理的书,但是我真的很难理解这一切。似乎我读得越多,就越困惑。我了解全局二级索引和本地二级索引以及哈希键+范围键的核心概念。问题在于将所有这些放在一起,并设计一个支持我的查询需求的表

到目前为止,我有以下查询要求:

  • 能够查询给定公司的活动订阅。也就是说,按
    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

    您可以在AWS DynamoDB控制台中快速尝试所有这些:


    大家好,我有几个澄清问题:SubscriptionID是否全球唯一?每个公司最多有多少订阅(rom)?根据您的查询需求,您是否确定DynamoDB与SQL RDBMS相比是正确的选择(您是否有充分的理由使用Dynamo)?@jarmod Yes,
    SubscriptionID
    是全局唯一的。每个公司不会有这么多订阅;最多几百个,但那将是非常罕见的。当然,我可以在关系数据库中实现这一点,现在您已经提到了,这可能是一个不错的选择。然而,我的困惑仍然适用于许多类似的用例,其中使用NoSQL数据库更合适。因此,我将非常感谢任何建议和清除我的困惑。谢谢我询问每个公司的订阅数量的原因是,为了让您查询在给定日期处于活动状态的给定公司的订阅,您必须使用GSI查询(:companyid=companyid和:date>=StartDate),但您还需要应用额外的服务器端筛选器(:date@jarmod啊,这很有道理!在这种情况下,这肯定不会是一个问题,而是一个很好的观察结果。我不知道这个限制,所以感谢您指出!我在文档中没有看到任何地方提到它,但您可能无论如何都是对的。:-)这是一个很棒的答案,非常感谢!你添加的索引是有意义的;我想我只是有点抗拒添加这么多GSI,并想知道这是否是正确的方法。我看到的唯一问题是l