巧用DynamoDB表设计消除关联查询的理论局限及场景分析
单表设计确实能解决大部分关系型场景的关联查询问题,但有些基础的关系型访问模式,哪怕把表设计到最优,也得靠多次查询甚至低效扫描才能实现,典型场景包括:
多对多关联的无定向深度遍历
比如用户和群组是多对多关系,要是想查某个用户加入的所有群组里的全部成员。哪怕在单表中把用户、群组、用户-群组关联记录都存一起,也得先查这个用户对应的所有群组ID,再挨个查询每个群组下的成员列表,没法通过一次查询直接拿到结果。无预定义维度的跨实体聚合统计
比如要统计所有订单里,不同地区用户的平均订单金额,但事先没把「地区+用户」「地区+订单」这类组合作为分区键或排序键来组织数据。这种情况下要么全表扫描,要么分多次查询不同地区的订单数据再在应用层做聚合,DynamoDB没法像关系型数据库那样直接通过JOIN+GROUP BY完成。动态多条件跨实体关联查询
类似关系型里的多表动态JOIN场景:比如同时按用户等级、订单状态、商品类别三个维度筛选关联数据,但这三个维度没预先组合成单表的索引键。单表设计里没法一次查询覆盖所有条件,只能先查符合其中一个条件的数据集,再在应用层过滤其他条件,或者多次查询不同的索引组合后合并结果。层级数据的任意深度递归查询
比如部门层级结构,要查某个顶级部门下的所有嵌套子部门(不管有多少层)。如果单表只存每个部门的父ID,那只能先查顶级部门的直接子部门,再递归查询每个子部门的下级,没法一次性获取全量层级数据。就算预先扁平化存储所有层级关系,一旦部门结构动态调整,维护成本会极高,最终还是得靠多次查询来处理。
内容的提问来源于stack exchange,提问作者fblundun

