版本: v1.0
制定时间: 2025-01-08
适用范围: 整个项目的所有数据库建表操作
重要性: ⚠️ 强制性规范 - 任何数据库相关开发都必须严格遵循本规范
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hzdyjs_xg?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD:password}
每个业务表都必须包含以下基础字段:
-- 主键字段(必须)
`id` bigint(20) NOT NULL COMMENT '主键ID',
-- 多租户字段(必须)
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
-- 审计字段(必须)
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
-- 逻辑删除字段(必须)
`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
-- 主键定义(必须)
PRIMARY KEY (`id`) USING BTREE
bigint(20) NOT NULLvarchar(20) NOT NULLtinyint(1) DEFAULT 0_id: ID 类型字段_time: 时间类型字段_status: 状态类型字段_flag: 标志类型字段项目中严格禁止使用数据库级别的外键约束(FOREIGN KEY),所有表关联关系通过应用层逻辑维护。
性能考虑
灵活性要求
维护便利性
应用层数据一致性
// 在业务逻辑中维护关联关系
@Transactional
public void deleteUser(Long userId) {
// 检查关联数据
if (hasRelatedData(userId)) {
throw new BusinessException("用户存在关联数据,无法删除");
}
// 执行删除
userService.deleteById(userId);
}
-- 通过字段命名明确标识关联关系
`user_id` bigint(20) COMMENT '用户ID,关联sys_user表',
`dept_id` bigint(20) COMMENT '部门ID,关联sys_dept表',
`role_id` bigint(20) COMMENT '角色ID,关联sys_role表'
数据校验注解
// 使用注解进行数据校验
@Entity
public class User {
@NotNull
@ExistReference(table = "sys_dept", field = "id")
private Long deptId;
}
_id 结尾user_id、parent_id、dept_id`user_id` bigint(20) NOT NULL COMMENT '用户ID,关联sys_user.id',
`parent_id` bigint(20) DEFAULT NULL COMMENT '父级ID,关联本表id,顶级为0',
索引设计
-- 关联字段必须创建索引,提升查询性能
KEY `idx_user_id` (`user_id`),
KEY `idx_dept_id` (`dept_id`),
-- 定期执行数据一致性检查脚本
SELECT u.* FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.id
WHERE u.dept_id IS NOT NULL AND d.id IS NULL;
监控和报警
每个表都必须创建以下基础索引:
-- 租户索引(必须)
KEY `idx_tenant_id` (`tenant_id`),
-- 删除标志索引(必须)
KEY `idx_deleted` (`deleted`),
-- 创建时间索引(建议)
KEY `idx_create_time` (`create_time`),
-- 组合索引:租户+删除标志(高效查询)
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
KEY `idx_status` (`status`)
KEY `idx_time_range` (`start_time`, `end_time`)
-- 关联字段索引(注意:不使用外键约束)
KEY `idx_parent_id` (`parent_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_dept_id` (`dept_id`)
-- 常用查询组合
KEY `idx_user_type_status` (`user_id`, `type`, `status`)
idx_字段名idx_字段1_字段2uk_字段名 或 uk_字段1_字段2-- ----------------------------
-- Table structure for 模块_表名
-- ----------------------------
DROP TABLE IF EXISTS `模块_表名`;
CREATE TABLE `模块_表名` (
-- 基础字段(必须)
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT 0 COMMENT '删除标志(0代表存在 1代表删除)',
-- 业务字段
`业务字段1` varchar(100) NOT NULL COMMENT '业务字段说明',
`业务字段2` text COMMENT '业务字段说明',
-- 关联字段(注意:不使用外键约束)
`user_id` bigint(20) DEFAULT NULL COMMENT '用户ID,关联sys_user.id',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID,关联sys_dept.id',
-- 状态和其他字段
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`sort_order` int(11) DEFAULT 0 COMMENT '排序',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
-- 主键和索引(注意:不创建外键约束)
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_business_key` (`tenant_id`, `业务唯一字段`, `deleted`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_deleted` (`deleted`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`),
KEY `idx_user_id` (`user_id`),
KEY `idx_dept_id` (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表的中文描述';
-- 系统配置类表(如字典、参数等)
CREATE TABLE `sys_配置表名` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
-- 配置相关字段
`config_key` varchar(100) NOT NULL COMMENT '配置键',
`config_value` varchar(500) DEFAULT NULL COMMENT '配置值',
`config_type` char(1) DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_config_key` (`config_key`, `tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';
-- 多对多关联表
CREATE TABLE `模块_关联表名` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
-- 关联字段(注意:不使用外键约束)
`主表_id` bigint(20) NOT NULL COMMENT '主表ID,关联主表.id',
`从表_id` bigint(20) NOT NULL COMMENT '从表ID,关联从表.id',
-- 主键和索引(注意:不创建外键约束)
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_relation` (`主表_id`, `从表_id`, `tenant_id`),
KEY `idx_主表_id` (`主表_id`),
KEY `idx_从表_id` (`从表_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关联关系表';
V{版本号}__{功能描述}.sql
例如:V1.0.1__add_user_table.sql
-- ==========================================
-- 数据库变更脚本
-- 版本:V1.0.1
-- 功能:新增用户表
-- 作者:开发者姓名
-- 时间:2025-01-08
-- ==========================================
-- 新增表
CREATE TABLE IF NOT EXISTS `new_table` (
-- 表结构定义
);
-- 修改表(如果需要)
ALTER TABLE `existing_table`
ADD COLUMN `new_column` varchar(100) COMMENT '新字段说明';
-- 数据初始化(如果需要)
INSERT INTO `new_table` VALUES (...);
-- 创建索引(如果需要)
CREATE INDEX `idx_new_column` ON `existing_table` (`new_column`);
-- 自动生成基础字段的存储过程
DELIMITER $$
CREATE PROCEDURE `add_base_fields`(IN table_name VARCHAR(64))
BEGIN
SET @sql = CONCAT('ALTER TABLE ', table_name, ' ADD COLUMN IF NOT EXISTS `tenant_id` varchar(20) NOT NULL DEFAULT ''000000'' COMMENT ''租户编号''');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加其他基础字段...
END$$
DELIMITER ;
-- 检查缺失基础字段的表
SELECT
TABLE_NAME,
CASE
WHEN COLUMN_NAME IS NULL THEN CONCAT('缺少字段: ', required_field)
ELSE '字段存在'
END AS check_result
FROM (
SELECT 'tenant_id' AS required_field
UNION SELECT 'create_time'
UNION SELECT 'update_time'
UNION SELECT 'deleted'
) rf
CROSS JOIN INFORMATION_SCHEMA.TABLES t
LEFT JOIN INFORMATION_SCHEMA.COLUMNS c
ON t.TABLE_NAME = c.TABLE_NAME
AND c.COLUMN_NAME = rf.required_field
WHERE t.TABLE_SCHEMA = 'hzdyjs_xg'
AND t.TABLE_TYPE = 'BASE TABLE'
AND c.COLUMN_NAME IS NULL;
项目中已有的标准表结构可参考:
hq_hall_info - 报告厅信息表hq_hall_reservation - 报告厅预约表hq_sat_survey - 问卷调查表sys_user - 用户表sys_dict_data - 字典数据表hq_(后勤)、sys_(系统)、gen_(代码生成)hq_hall_info、sys_user_roleuser_name、create_time、hall_status如有疑问或需要技术支持,请联系:
最后更新: 2025-01-08
下次审查: 2025-07-08