You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.8 KiB
3.8 KiB
ADR 002: 升级 PostgreSQL 17 使用原生 UUID v7
状态: 已实施
创建日期: 2025-01-18
决策者: 架构团队
背景
项目初期使用 PostgreSQL 14 + Python uuid-utils 库生成 UUID v7。虽然可行,但存在以下问题:
- 应用层依赖:ID 生成逻辑在 Python 层,增加应用复杂度
- 类型不匹配:SQLModel 使用
str类型,数据库存储为VARCHAR,索引性能未达最优 - 未来趋势:PostgreSQL 17 已原生支持
gen_uuid_v7()
决策
升级到 PostgreSQL 17,使用数据库原生 UUID v7 生成
技术方案
-
数据库升级
- Docker:
postgres:14-alpine→postgres:17-alpine - 原生函数:
gen_uuid_v7()(无需扩展)
- Docker:
-
模型定义
from uuid import UUID from sqlalchemy import Column, text from sqlalchemy.dialects.postgresql import UUID as PG_UUID id: UUID = Field( sa_column=Column( PG_UUID(as_uuid=True), primary_key=True, server_default=text("gen_uuid_v7()") ) ) -
Schema 定义
from uuid import UUID class UserResponse(BaseModel): user_id: UUID # 替代 str -
依赖清理
- 移除:
uuid-utils==0.9.0 - 保留:
app/core/id_generator.py(备用/测试)
- 移除:
优势
| 维度 | 改进 |
|---|---|
| 性能 | UUID 列类型 + B-tree 索引,查询性能优于 VARCHAR |
| 可靠性 | 数据库层面保证 ID 生成,无应用层故障风险 |
| 简洁性 | 减少 Python 依赖,代码更简洁 |
| 标准化 | 使用 PostgreSQL 原生特性,符合最佳实践 |
| 未来性 | PostgreSQL 17+ 长期支持,无需维护自定义逻辑 |
劣势与风险
| 风险 | 缓解措施 |
|---|---|
| PostgreSQL 17 较新 | 开发阶段无影响;生产环境需确认云服务商支持 |
| 迁移成本 | 开发阶段数据量小,直接重建表即可 |
| 兼容性 | 保留 id_generator.py 作为备用方案 |
实施细节
变更文件
- ✅
server/docker-compose.yml: 升级镜像版本 - ✅
server/app/models/user.py: UUID 类型 +server_default - ✅
server/app/models/folder.py: UUID 类型 +server_default - ✅
server/app/schemas/user.py: UUID 类型 - ✅
server/app/schemas/folder.py: UUID 类型 - ✅
server/requirements.txt: 移除uuid-utils
迁移步骤
# 1. 停止并删除旧容器
cd server
docker-compose down -v
# 2. 拉取新镜像
docker-compose pull postgres
# 3. 重建数据库
python -m app.migrations.001_uuid_migration
# 4. 启动服务
docker-compose up -d
验证
-- 验证 PostgreSQL 版本
SELECT version();
-- 应显示: PostgreSQL 17.x
-- 验证 UUID v7 函数
SELECT gen_uuid_v7();
-- 应返回: 019d1234-5678-7abc-def0-123456789abc
-- 验证列类型
\d users
-- id 列应为: uuid (not null, default gen_uuid_v7())
后续工作
- 生产环境评估:确认云服务商(阿里云 RDS、AWS RDS)对 PostgreSQL 17 的支持情况
- 性能测试:对比 UUID vs VARCHAR 的索引性能
- 监控告警:添加 ID 生成失败的监控
参考资料
决策结果: ✅ 已实施,开发环境运行正常