数据库设计
首个数据库目标是 PostgreSQL 18。开发环境固定使用 postgres:18.4-alpine,
生产环境应持续安装 PostgreSQL 18 的最新补丁版本。
users
users 是首版全局登录用户表:
| 字段 | 类型 | 约束 |
|---|---|---|
id | uuid | 主键,由应用生成 |
email | varchar(254) | 去除首尾空白并转小写,全局唯一 |
display_name | varchar(80) | 去除首尾空白,长度 1–80 |
password_hash | text | 只保存密码散列,不允许空值 |
created_at | timestamptz | 创建时间 |
updated_at | timestamptz | 最近更新时间 |
首版不建立角色、权限、Tenant、Profile 扩展表或软删除字段。查询 Profile 时
必须显式选择公开字段,不能使用 SELECT * 把 password_hash 带入响应模型。
tower_sessions.session
Session Store 使用独立 schema:
| 字段 | 类型 | 用途 |
|---|---|---|
id | text | 不透明 Session ID |
data | bytea | Session 序列化数据 |
expiry_date | timestamptz | 过期时间和清理索引 |
该结构与 tower-sessions SQLx Store 兼容,但表由仓库 migration 创建。应用代码
不得调用 Store 自带的 migrate()。应用每小时清理过期记录;Session 闲置
12 小时失效,并由应用层额外执行 7 天绝对期限。
时间与标识
- 数据库存储统一使用
timestamptz和 UTC。 - 对外时间使用 RFC 3339。
- 用户 ID 使用 UUID,不把自增序号暴露为公共身份。