3.0 KiB
3.0 KiB
4.10 数据库设计
:::tip 概述 数据库层有三个设计支点:多方言驱动注册表(一套代码五种数据库)、统一列约定(审计字段 + 软删 + 租户)、全局钩子(红线在 SQL 层执行)。 :::
多方言驱动注册表
internal/model/db/db.go
driverRegistry: 驱动名 → 工厂函数
内置注册:mysql / postgres / sqlserver / sqlite
扩展注册:oracle(构建标签 -tags oracle,经 RegisterDriver 挂入)
db.Init 按 database.default.driver 选择方言工厂建立连接池(maxOpen/maxIdle/connMaxLifetime),SQL 调试日志受 debug 开关控制。切换方言只改配置,代码零改动。
全库列约定
id 主键(INT 自增)
create_user 创建人 create_time 创建时间
update_user 更新人 update_time 更新时间
del_flag 软删标记(0 正常 / 1 删除)
tenant_id 租户 ID(仅租户级表,白名单 9 张)
写侧由全局钩子补齐(业务不赋值),读侧由 Scope 过滤(del_flag=0、租户条件)。
表清单(25 张)
| 域 | 表 |
|---|---|
| 组织权限 | gin_user、gin_user_role、gin_role、gin_role_menu、gin_menu、gin_dept、gin_level、gin_position、gin_tenant |
| 内容 | gin_article、gin_category、gin_notice、gin_link |
| 数据配置 | gin_dict、gin_dict_item、gin_param、gin_config、gin_config_item、gin_city |
| 任务日志 | gin_job、gin_job_log、gin_operation_log、gin_login_log |
| 工具 | gin_file_template、gin_example |
列级详情见 附录 B 数据库表结构速查。
关联模型
gin_user ──< gin_user_role >── gin_role ──< gin_role_menu >── gin_menu
gin_dept 树形(parent_id),数据权限按 dept_id 收敛
gin_menu 树形(parent_id),permission 列承载权限节点
应用层不使用外键——引用完整性由软删除纪律与业务校验维护(删除前 ExistsByCond 检查引用)。
索引规约
| 类型 | 命名 | 场景 |
|---|---|---|
| 普通索引 | idx_{表}_{列} | 查询高频列(del_flag、外键列、模糊列) |
| 唯一索引 | uk_{表}_{列} | 唯一约束(与 UniqueFields 预检配套,以 uk 为最终防线) |
软删除与数据生命周期
业务删除 → UPDATE del_flag=1(Ctx 过滤后不可见)
物理 DELETE → 全局钩子拦截,WithPhysicalDelete(ctx) 显式放行
超期清理 → LogClean 定时任务物理清理过期日志(放行场景的典型用例)
事务
db.WithTrans(ctx, fn):回调 ctx 携带事务连接,返回错误整体回滚。跨模块写操作(如用户+关联角色)必须同事务。
跨库迁移
cmd/migrator(make migrator)实现源库内省 → 目标方言 DDL → 分批搬运 → 序列修复,支持五方言互迁。见 7.6 数据库迁移工具。