Amazon web services 如何在DynamoDB中保存非重叠范围

Amazon web services 如何在DynamoDB中保存非重叠范围,amazon-web-services,amazon-dynamodb,overlap,nosql,Amazon Web Services,Amazon Dynamodb,Overlap,Nosql,假设我想在DynamoDB中存储一些实体,每个实体由3个关键属性定义: group\u id[string]:实体所属组的id from[int]:范围的起点(包括) to[int]:范围的末尾(包括) 约束条件是: 在一个组中,重叠范围是不允许的 但是,跨组允许重叠 以下是几个条目示例: (“abc”,10,21) (“xyz”,13,27) (“xyz”,45,61) (“abc”,39,57) (“abc”,81,93) 如您所见,上面列表中的组内没有重叠范围。现在,如果我们想

假设我想在DynamoDB中存储一些实体,每个实体由3个关键属性定义:

  • group\u id
    [
    string
    ]:实体所属组的id
  • from
    [
    int
    ]:范围的起点(包括)
  • to
    [
    int
    ]:范围的末尾(包括)
约束条件是:

  • 在一个组中,重叠范围是不允许的
  • 但是,跨组允许重叠
以下是几个条目示例:

  • “abc”
    10
    21
  • “xyz”
    13
    27
  • “xyz”
    45
    61
  • “abc”
    39
    57
  • “abc”
    81
    93
如您所见,上面列表中的组内没有重叠范围。现在,如果我们想在上面的列表中添加一个条目,那么这里有几个示例说明什么是允许的,什么是不允许的:

  • “abc”
    19
    27
    )不允许,因为它与第一项重叠
  • 允许使用(
    “abc”
    23
    27
  • “xyz”
    39
    47
    )不允许,因为它与第三项重叠
  • 允许使用(
    “xyz”
    39
    55
在这种情况下,我的问题是,如何设计模式以及如何使用模式,以防止用户为给定组插入重叠范围

如果解决方案需要将一些(元)属性添加到模式中,我可以接受;只要能解决问题,我什么都可以。需要思考的其他相关问题:我们是否应该将每个实体添加为单独的行?或者属于单个组的所有实体都应转到一行(具有列表/映射属性)

表中可能的查询如下所示:

  • 给定一个
    组id
    和一个超级范围{
    from
    to
    },返回所有具有相同
    组id
    from
    to
    在超级范围(包括)定义的限制内的条目

具体来说,根据上面列出的查询决定分区键、范围键、辅助索引(本地/辅助)的选项有哪些?

步骤1-创建分区键(组id),范围键打开(从,到)


步骤2-需要在应用程序级别限制from、to字段。”在dynamodb的数据库级别上,启用此功能的“检查约束”不可用。步骤1-创建分区键(组id),范围键打开(从,到)


步骤2-需要在应用程序级别限制from、to字段。”在dynamodb中,启用此功能的check constraints在数据库级别不可用。一种方法是使用组id作为主键,使用“from”作为范围键,“to”作为辅助范围键(本地辅助索引)。 然后,每次要检查范围在x和y之间的新项目时,都需要执行以下检查:

  • 检查x和y之间是否没有“from”值
  • 检查x和y之间是否没有“到”值
  • 检查最大值为“from”且“from”小于x的项目是否也具有小于x的“to”
  • 检查最小值为“to”的项目,确保“to”大于y,且“from”也大于y
  • 考虑到所有这些检查都使用范围键查询,它应该相当快


    请注意,如果您的范围选项有限(例如范围只能在1和365之间),则可以使用更简单的解决方案

    一种方法是使用组id作为主键,使用“from”作为范围键,“to”作为辅助范围键(本地辅助索引)。 然后,每次要检查范围在x和y之间的新项目时,都需要执行以下检查:

  • 检查x和y之间是否没有“from”值
  • 检查x和y之间是否没有“到”值
  • 检查最大值为“from”且“from”小于x的项目是否也具有小于x的“to”
  • 检查最小值为“to”的项目,确保“to”大于y,且“from”也大于y
  • 考虑到所有这些检查都使用范围键查询,它应该相当快

    请注意,如果您的范围选项有限(例如范围只能在1到365之间),则可以使用更简单的解决方案