假设我想在DynamoDB中存储一些实体,每个实体由3个关键属性定义:
group_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
)是允许的。鉴于这种情况,我的问题是,如何设计架构以及如何使用它以防止用户插入给定组的重叠范围?
如果解决方案需要将某些(元)属性添加到模式中,我可以使用它;只要能解决问题,我就可以解决任何问题。需要思考的其他相关问题:我们应该将每个实体添加为单独的行吗?或者属于单个组的所有实体应该转到一行(具有列表/地图属性)?
表上可能的查询如下:
group_id
和超范围{from
和to
},请返回具有相同group_id
且其from
和{的所有条目{1}}属于超范围(包括)定义的限制。具体说明根据上面列出的查询决定分区键,范围键,二级索引(本地/二级)的选项有哪些?
答案 0 :(得分:0)
步骤1 - 创建分区键(组ID),范围键(从,到)
第2步 - 需要在应用程序级别对from,to fields进行限制。 “检查约束”以启用此功能在dynamodb中的数据库级别不可用
答案 1 :(得分:0)
一种方法是使用组ID作为主键,使用"来自"作为范围键和"到"作为次要范围键(Local Secondary Index)。 然后,每次要检查范围在x和y之间的新项目时,都需要执行以下检查:
鉴于所有这些检查都使用范围键查询,它应该相当快。
请注意,如果范围选项有限(例如范围只能在1到365之间),则可以使用更简单的解决方案