Files
easygoadmin-wiki/EasyGoAdmin_Gin_AntdVue/zh/architecture/database-design.md
T
2026-10-25 17:24:27 +08:00

78 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)