78 lines
3.0 KiB
Markdown
78 lines
3.0 KiB
Markdown
# 4.10 数据库设计
|
||
|
||
:::tip 概述
|
||
数据库层有三个设计支点:**多方言驱动注册表**(一套代码五种数据库)、**统一列约定**(审计字段 + 软删 + 租户)、**全局钩子**(红线在 SQL 层执行)。
|
||
:::
|
||
|
||
## 多方言驱动注册表
|
||
|
||
```text
|
||
internal/model/db/db.go
|
||
driverRegistry: 驱动名 → 工厂函数
|
||
内置注册:mysql / postgres / sqlserver / sqlite
|
||
扩展注册:oracle(构建标签 -tags oracle,经 RegisterDriver 挂入)
|
||
```
|
||
|
||
`db.Init` 按 `database.default.driver` 选择方言工厂建立连接池(maxOpen/maxIdle/connMaxLifetime),SQL 调试日志受 `debug` 开关控制。切换方言只改配置,代码零改动。
|
||
|
||
## 全库列约定
|
||
|
||
```text
|
||
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 数据库表结构速查](/zh/appendix/database-tables.html)。
|
||
|
||
## 关联模型
|
||
|
||
```text
|
||
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 为最终防线) |
|
||
|
||
## 软删除与数据生命周期
|
||
|
||
```text
|
||
业务删除 → UPDATE del_flag=1(Ctx 过滤后不可见)
|
||
物理 DELETE → 全局钩子拦截,WithPhysicalDelete(ctx) 显式放行
|
||
超期清理 → LogClean 定时任务物理清理过期日志(放行场景的典型用例)
|
||
```
|
||
|
||
## 事务
|
||
|
||
`db.WithTrans(ctx, fn)`:回调 ctx 携带事务连接,返回错误整体回滚。跨模块写操作(如用户+关联角色)必须同事务。
|
||
|
||
## 跨库迁移
|
||
|
||
`cmd/migrator`(`make migrator`)实现源库内省 → 目标方言 DDL → 分批搬运 → 序列修复,支持五方言互迁。见 [7.6 数据库迁移工具](/zh/tools/db-migrate.html)。
|
||
|
||
## 下一步
|
||
|
||
→ [4.11 安全架构设计](/zh/architecture/security.html)
|