数据库规范
2026/10/26大约 2 分钟
数据库规范
MySQL utf8mb4,ThinkORM 读写。库级表前缀 am_(config/database.php / .env 的 DB_PREFIX,注意大写 PREFIX,小写会读不到而回落默认值)。
表命名
| 类型 | 规则 | 示例 |
|---|---|---|
| 系统表 | system_{module} | system_user、system_menu |
| 中间表 | 随主表前缀 {主表前缀}_{m1}_{m2} | system_user_role、system_role_menu、system_dept_user |
| 插件业务表 | {name}_ 前缀 | am_demo_post(插件标识 + 下划线) |
中间表模型继承 ThinkORM Pivot,其余继承 BaseModel。SQL 里的 __PREFIX__ 由安装期替换成 am_;插件 SQL 的 {{APP_NAME}}/{{APP_ID}} 由 DatabaseService::executeInstallSql 替换。
字段
必备字段:
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`create_time` INT UNSIGNED DEFAULT NULL COMMENT '创建时间',
`update_time` INT UNSIGNED DEFAULT NULL COMMENT '更新时间',
`delete_time` INT UNSIGNED DEFAULT NULL COMMENT '删除时间',
`created_by` INT UNSIGNED DEFAULT NULL COMMENT '创建人ID',
`updated_by` INT UNSIGNED DEFAULT NULL COMMENT '更新人ID',常用字段:status TINYINT(1) DEFAULT 1(0 禁用 1 启用)、sort INT DEFAULT 0、remark VARCHAR(255) DEFAULT ''、软删除靠 delete_time。
时间一律 INT 时间戳
create_time/update_time/delete_time 用 INT UNSIGNED 存 Unix 时间戳,禁用 DATETIME。写入交给 ORM 自动管理(见后端规范·时间字段),不要在 SQL 或代码里手填。
索引
- 主键:
PRIMARY KEY (id) - 唯一:
UNIQUE KEY uk_{field} ({field}) - 普通:
KEY idx_{field} ({field}) - 联合:
KEY idx_{field1}_{field2} ({field1}, {field2})(区分度高的列在前)
外键与关联
不使用物理外键约束,关联在应用层维护;删除前查关联数据、内置数据(is_sys=1)禁删。避免 N+1,用 with() 预加载、field() 只取需要的列。
插件建表与幂等
- 建表、插数据写成幂等:
CREATE TABLE IF NOT EXISTS、INSERT ... SELECT ... WHERE NOT EXISTS,升级重跑不报"已存在"。 - 插件入口菜单走保留 code
app:entry:{name}、path指向宿主路由/plugin-app/{name}(不含记录 id,可迁移)。 - 纳入备份的业务表须在
Plugin::backupTables()显式声明,且表名以{name}_前缀。
机制细节见安装与升级。
