DynamoDB如何实现‘Display ID(显示ID)’模式?
实现用户友好型短ID的可行方案
我有如下DynamoDB文档:
hashKey: "PROJECT:1edb63f3-eb2d-6798-baba-0242ac120005" name: "My Project" createdAt: 2023-01-01
当前API通过以下方式获取项目:
GET /api/v1/projects/1edb63f3-eb2d-6798-baba-0242ac120005
现在需要更短、易分享的ID用于GET请求,以下是你提出的两种方案的可行性分析:
方案1:压缩原ID为短字符串
这个方案完全可行,核心是用可逆编码算法把长UUID转换成更紧凑的字符串,具体操作思路:
- 先去掉UUID中的
-,得到32位十六进制字符串 - 将十六进制转成二进制后,用Base64或Base58(剔除0、O、l、I这类易混淆字符)编码
- 解码时反向操作:把短字符串还原成原UUID,再拼接
PROJECT:前缀即可定位到DynamoDB的hashKey
举个例子,原UUID去掉-后是1edb63f3eb2d6798baba0242ac120005,用Base64编码后会缩短到22位左右,Base58的长度相近,且更适合人类阅读分享。
需要注意:
- 确保编码后的字符串URL安全,可将Base64中的
+和/替换为-和_,避免URL转义问题 - 无需额外存储,仅在API层做编码解码即可,对现有DynamoDB结构无侵入
方案2:添加displayId字段并建立映射
这个方案同样可行,并不繁琐,适合需要自定义ID(比如自增序列、语义化ID)的场景:
- 在DynamoDB文档中新增
displayId字段,值可以是自增数字、自定义短字符串(如项目缩写+数字) - 为了通过
displayId快速定位原hashKey,需在DynamoDB中创建全局二级索引(GSI),将displayId设为GSI的hashKey,查询时直接用displayId检索GSI就能拿到对应的原hashKey - 若使用自增序列,因DynamoDB无原生自增功能,可单独建表存储计数器,创建项目时先获取自增ID,再写入主表和GSI
优势
- ID可完全自定义,比如用
proj-123这类直观格式 - 解码逻辑简单,直接查询GSI即可,无需复杂的编码转换
劣势
- 需要额外维护GSI和可能的计数器表,增加少量存储与操作成本
- 若允许用户自定义displayId,需处理重复值问题,要做唯一性校验
总结
- 若只需要无侵入、快速实现的短ID,优先选方案1,编码解码逻辑简单,无需修改数据库结构
- 若需要自定义语义化ID或担心编码后的字符串不够直观,选方案2,虽有少量维护成本,但灵活性更高
内容的提问来源于stack exchange,提问作者Mojimi
相关产品推荐
相关产品推荐

