如何在DynamoDB

时间:2017-06-10 05:56:54

标签: amazon-web-services amazon-dynamodb overlap nosql

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

  • group_id [string]:实体所属群组的ID。
  • from [int]:范围的开头(包括)。
  • to [int]:范围的结尾(包括)。

约束是:

  • 在组内,重叠范围允许。
  • 但是,在整个群体中,允许重叠。

以下是条目的几个例子:

  • "abc"1021
  • "xyz"1327
  • "xyz"4561
  • "abc"3957
  • "abc"8193

如您所见,上面列表中的组内没有重叠范围。现在,如果我们想在上面的列表中添加一个条目,那么这里有一些关于允许的内容和不允许的内容的例子:

  • "abc"1927允许,因为它与第一项重叠。
  • "abc"2327)是允许的。
  • "xyz"3947允许,因为它与第三项重叠。
  • "xyz"3955)是允许的。

鉴于这种情况,我的问题是,如何设计架构以及如何使用它以防止用户插入给定组的重叠范围?

如果解决方案需要将某些(元)属性添加到模式中,我可以使用它;只要能解决问题,我就可以解决任何问题。需要思考的其他相关问题:我们应该将每个实体添加为单独的行吗?或者属于单个组的所有实体应该转到一行(具有列表/地图属性)?

表上可能的查询如下:

  • 鉴于group_id和超范围{fromto},请返回具有相同group_id且其from和{的所有条目{1}}属于超范围(包括)定义的限制。

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

2 个答案:

答案 0 :(得分:0)

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

第2步 - 需要在应用程序级别对from,to fields进行限制。 “检查约束”以启用此功能在dynamodb中的数据库级别不可用

答案 1 :(得分:0)

一种方法是使用组ID作为主键,使用"来自"作为范围键和"到"作为次要范围键(Local Secondary Index)。 然后,每次要检查范围在x和y之间的新项目时,都需要执行以下检查:

  1. 检查"来自" x和y之间的值
  2. 检查没有"到" x和y之间的值
  3. 检查"中最大值"的项目是否来自"这样"来自"小于x也有"到"小于x
  4. 检查"到"的值最小的项目这样"到"大于y也有"来自"大于y
  5. 鉴于所有这些检查都使用范围键查询,它应该相当快。

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