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

3.0 KiB
Raw Blame History

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 数据库迁移工具。

下一步

→ 4.11 安全架构设计