DynamoDB单表设计:多关联资源与复杂访问模式实现求助
DynamoDB单表设计重构方案(职位发布场景)
主表核心结构
| PK (Hash Key) | SK (Sort Key) | Title | Publish Date | Status | Company ID | Required Certificates | ... |
|---|---|---|---|---|---|---|---|
| COMPANY#12345 | COMPANY#META | Microsoft | - | - | 12345 | - | ... |
| JOB#7890 | JOB#DETAILS | Developer | 2023-03-28 | taking applications | 12345 | ["AWS Certified", "Java"] | ... |
| JOB#7891 | JOB#DETAILS | Forklift Operator | 2023-04-01 | reviewing applications | 12345 | ["Forklift certified"] | ... |
针对性GSI设计(覆盖所有访问模式)
1. GSI1:按公司+发布日期访问
- GSI1主键(PK):
COMPANY#<Company ID> - GSI1排序键(SK):
PUBLISH_DATE#<YYYY-MM-DD>#JOB#<Job ID> - 包含字段:所有职位核心属性
查询逻辑:
- 按公司获取职位:
GSI1-PK = 'COMPANY#12345',默认按发布日期升序排列;如需倒序,设置ScanIndexForward = false - 按公司+日期范围获取职位:
GSI1-PK = 'COMPANY#12345' AND SK BETWEEN 'PUBLISH_DATE#2023-03-01' AND 'PUBLISH_DATE#2023-03-31'
2. GSI2:按状态+发布日期访问
- GSI2主键(PK):
STATUS#<Status Value> - GSI2排序键(SK):
PUBLISH_DATE#<YYYY-MM-DD>#JOB#<Job ID> - 包含字段:所有职位核心属性
查询逻辑:
- 按状态获取职位:
GSI2-PK = 'STATUS#taking applications',支持按发布日期排序或筛选日期范围
3. GSI3:按证书+发布日期访问
- GSI3主键(PK):
CERT#<Certificate Name> - GSI3排序键(SK):
PUBLISH_DATE#<YYYY-MM-DD>#JOB#<Job ID> - 注意:一个职位若需多个证书,要为每个证书单独写入一条GSI3记录(比如JOB#7890对应两条GSI3条目,PK分别为
CERT#AWS Certified和CERT#Java)
查询逻辑:
- 按所需证书获取职位:
GSI3-PK = 'CERT#Forklift certified',可按发布日期排序
4. GSI4:全局职位列表(按发布日期)
- GSI4主键(PK):
ALL_JOBS - GSI4排序键(SK):
PUBLISH_DATE#<YYYY-MM-DD>#JOB#<Job ID> - 包含字段:所有职位核心属性
查询逻辑:
- 获取所有职位:
GSI4-PK = 'ALL_JOBS',避免全表扫描,效率更高 - 按发布日期获取职位:
GSI4-PK = 'ALL_JOBS' AND SK BETWEEN 'PUBLISH_DATE#2023-03-01' AND 'PUBLISH_DATE#2023-03-31'
单个职位查询
直接用主表精准查询:
PK = 'JOB#7890' AND SK = 'JOB#DETAILS'
无需额外GSI,查询效率拉满。
设计优势
- 每个访问模式都对应精准的GSI查询,避免低效的全表扫描或过滤
- 排序键包含发布日期+职位ID,既支持按日期排序,又保证排序键的唯一性(避免同日期职位的键冲突)
- 公司元数据与职位数据共存于单表,完全符合DynamoDB单表设计的核心原则
内容的提问来源于stack exchange,提问作者nicks6853
相关产品推荐
相关产品推荐

