30 KiB
30 KiB
社团管理数据库设计
1. 设计概述
1.1 设计目标
设计一个完整的社团管理数据库系统,支持社团管理、活动组织、考勤签到、材料收集等全流程管理功能。
1.2 设计原则
- 标准化: 所有表遵循统一的基础字段规范
- 规范化: 避免数据冗余,合理设计表关系
- 可扩展: 预留扩展字段,支持业务发展
- 高性能: 合理设计索引,优化查询性能
- 多租户: 支持多租户架构设计
1.3 命名规范
- 表名前缀: stgl_(社团管理)
- 字段命名: 采用下划线分隔的小写字母
- 索引命名: idx_表名_字段名 或 uk_表名_字段名(唯一索引)
1.4 基础字段规范
所有业务表必须包含以下基础字段:
`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代表删除)'
2. 数据表设计
2.1 社团信息表(stgl_club)
表结构
CREATE TABLE `stgl_club` (
`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代表删除)',
-- 基本信息字段
`club_name` varchar(100) NOT NULL COMMENT '社团名称',
`club_type` varchar(50) NOT NULL COMMENT '社团类型',
`establish_date` date COMMENT '成立日期',
`description` text COMMENT '社团简介(500字以内)',
`email` varchar(100) COMMENT '邮箱',
`phone` varchar(20) COMMENT '电话',
`logo_url` varchar(500) COMMENT 'logo图片路径',
-- 管理人员信息
`president_name` varchar(50) COMMENT '社长姓名',
`president_student_no` varchar(20) COMMENT '社长学号',
`president_dept` varchar(100) COMMENT '社长院系',
`president_major` varchar(100) COMMENT '社长专业',
`president_class` varchar(100) COMMENT '社长班级',
`president_phone` varchar(20) COMMENT '社长联系方式',
`vice_president_name` varchar(50) COMMENT '副社长姓名',
`vice_president_student_no` varchar(20) COMMENT '副社长学号',
`advisor_name` varchar(50) COMMENT '指导老师姓名',
`advisor_dept` varchar(100) COMMENT '指导老师所属院系',
-- 运营信息
`member_limit` int DEFAULT 0 COMMENT '成员规模上限',
`departments` text COMMENT '组织架构(部门设置及职责)',
`recruit_cycle` varchar(50) COMMENT '招新周期',
`recruit_time` varchar(50) COMMENT '招新时间',
`activity_frequency` varchar(50) COMMENT '活动频率',
`funding_sources` varchar(200) COMMENT '经费来源(多选)',
`charter_url` varchar(500) COMMENT '章程文档路径',
`honors` text COMMENT '历史荣誉',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_club_name` (`club_name`, `tenant_id`, `deleted`),
KEY `idx_club_type` (`club_type`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='社团信息表';
字段说明
club_type: 社团类型,枚举值见码表status: 1-正常,0-停用funding_sources: JSON格式存储多个经费来源
2.2 志愿者队伍表(stgl_volunteer_team)
表结构
CREATE TABLE `stgl_volunteer_team` (
`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代表删除)',
-- 基本信息
`team_name` varchar(100) NOT NULL COMMENT '队伍名称',
`team_type` varchar(50) COMMENT '队伍类型',
`description` text COMMENT '队伍简介',
`leader_name` varchar(50) COMMENT '队长姓名',
`leader_student_no` varchar(20) COMMENT '队长学号',
`leader_user_id` bigint(20) COMMENT '队长用户ID',
`advisor_name` varchar(50) COMMENT '指导老师',
`member_limit` int DEFAULT 0 COMMENT '成员上限',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-停用)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_team_name` (`team_name`, `tenant_id`, `deleted`),
KEY `idx_team_type` (`team_type`),
KEY `idx_leader_user_id` (`leader_user_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='志愿者队伍表';
2.3 成员关系表(stgl_member)
表结构
CREATE TABLE `stgl_member` (
`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代表删除)',
-- 关系信息
`member_type` tinyint NOT NULL COMMENT '成员类型(1-社团成员 2-志愿者)',
`relation_id` bigint(20) NOT NULL COMMENT '关联ID(社团ID或志愿者队伍ID)',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`role_type` tinyint COMMENT '角色类型(1-社长 2-副社长 3-成员)',
`join_time` datetime COMMENT '加入时间',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-退出)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_relation` (`member_type`, `relation_id`, `user_id`, `deleted`),
KEY `idx_member_type` (`member_type`),
KEY `idx_relation_id` (`relation_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_join_time` (`join_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成员关系表';
字段说明
member_type: 1-社团成员,2-志愿者role_type: 1-社长,2-副社长,3-成员status: 1-正常,0-退出
2.4 活动信息表(stgl_activity)
表结构
CREATE TABLE `stgl_activity` (
`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代表删除)',
-- 基本信息
`activity_name` varchar(100) NOT NULL COMMENT '活动名称',
`activity_type` varchar(50) NOT NULL COMMENT '活动类型',
`activity_theme` varchar(100) COMMENT '活动主题',
`start_time` datetime COMMENT '开始时间',
`end_time` datetime COMMENT '结束时间',
`location` varchar(200) COMMENT '活动地点',
`description` text COMMENT '活动简介(1000字以内)',
`poster_url` varchar(500) COMMENT '活动海报路径',
`related_dept_id` bigint(20) COMMENT '关联部门ID',
`related_dept_name` varchar(100) COMMENT '关联部门名称',
`related_club_id` bigint(20) COMMENT '关联社团ID',
-- 主办承办方信息
`organizer_name` varchar(100) COMMENT '主办方名称',
`organizer_type` varchar(50) COMMENT '主办方类型',
`organizer_contact` varchar(100) COMMENT '主办方联系人',
`organizer_phone` varchar(20) COMMENT '主办方电话',
`co_organizers` json COMMENT '承办方信息(JSON格式存储多个承办方)',
`instructors` json COMMENT '指导老师列表(JSON格式)',
-- 报名管理信息
`registration_type` tinyint COMMENT '报名方式(1-个人 2-团队 3-两者均可)',
`registration_start` datetime COMMENT '报名开始时间',
`registration_end` datetime COMMENT '报名结束时间',
`registration_status` tinyint COMMENT '报名状态(0-未开始 1-报名中 2-已截止 3-已关闭)',
`max_participants` int COMMENT '总人数上限',
`max_teams` int COMMENT '团队数量上限',
`team_size_min` int COMMENT '每队最小人数',
`team_size_max` int COMMENT '每队最大人数',
`need_approval` tinyint DEFAULT 0 COMMENT '是否需要审核(0-无需 1-需要)',
-- 活动状态信息
`activity_status` varchar(20) DEFAULT '筹备中' COMMENT '活动状态',
`is_finished` tinyint DEFAULT 0 COMMENT '是否为已办活动(0-否 1-是)',
`summary` text COMMENT '活动总结报告',
`achievements` text COMMENT '活动成果',
`import_source` varchar(200) COMMENT '导入来源信息',
PRIMARY KEY (`id`),
KEY `idx_activity_name` (`activity_name`),
KEY `idx_activity_type` (`activity_type`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_activity_status` (`activity_status`),
KEY `idx_registration_status` (`registration_status`),
KEY `idx_related_dept_id` (`related_dept_id`),
KEY `idx_related_club_id` (`related_club_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动信息表';
字段说明
activity_type: 活动类型,枚举值见码表registration_type: 1-个人,2-团队,3-两者均可registration_status: 0-未开始,1-报名中,2-已截止,3-已关闭activity_status: 筹备中、待审批、已通过、进行中、已结束、已取消、已驳回need_approval: 0-无需审核,1-需要审核
2.5 团队信息表(stgl_team_info)
表结构
CREATE TABLE `stgl_team_info` (
`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代表删除)',
-- 团队信息
`team_name` varchar(100) NOT NULL COMMENT '团队名称',
`activity_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`leader_user_id` bigint(20) NOT NULL COMMENT '队长用户ID',
`leader_name` varchar(50) COMMENT '队长姓名',
`leader_student_no` varchar(20) COMMENT '队长学号',
`team_members` json COMMENT '团队成员信息(JSON格式)',
`team_size` int DEFAULT 0 COMMENT '团队人数',
`description` text COMMENT '团队描述',
`status` tinyint DEFAULT 1 COMMENT '状态(1-正常 0-解散)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_team_activity` (`team_name`, `activity_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_leader_user_id` (`leader_user_id`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='团队信息表';
2.6 活动报名表(stgl_activity_registration)
表结构
CREATE TABLE `stgl_activity_registration` (
`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代表删除)',
-- 报名基本信息
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`registration_type` tinyint NOT NULL COMMENT '报名类型(1-个人 2-团队)',
`team_id` bigint(20) COMMENT '团队ID(团队报名时)',
`team_name` varchar(100) COMMENT '团队名称',
`registration_time` datetime COMMENT '报名时间',
-- 审核信息
`approval_status` tinyint DEFAULT 0 COMMENT '审核状态(0-待审核 1-通过 2-驳回)',
`approval_time` datetime COMMENT '审核时间',
`approval_by` bigint(20) COMMENT '审核人ID',
`approval_remark` varchar(500) COMMENT '审核意见',
-- 成绩信息
`score` varchar(50) COMMENT '获得成绩',
`score_time` datetime COMMENT '成绩录入时间',
`score_by` bigint(20) COMMENT '成绩录入人ID',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_registration_type` (`registration_type`),
KEY `idx_team_id` (`team_id`),
KEY `idx_approval_status` (`approval_status`),
KEY `idx_registration_time` (`registration_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动报名表';
字段说明
registration_type: 1-个人报名,2-团队报名approval_status: 0-待审核,1-通过,2-驳回
2.7 考勤任务表(stgl_attendance_task)
表结构
CREATE TABLE `stgl_attendance_task` (
`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代表删除)',
-- 考勤任务信息
`activity_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`task_name` varchar(100) NOT NULL COMMENT '考勤任务名称',
`task_status` tinyint DEFAULT 0 COMMENT '任务状态(0-未发起 1-进行中 2-已停止 3-已结束)',
`start_time` datetime COMMENT '签到开始时间',
`end_time` datetime COMMENT '签到结束时间',
-- 地理位置设置
`location_required` tinyint DEFAULT 0 COMMENT '是否需要地理位置(0-否 1-是)',
`check_location` varchar(200) COMMENT '签到地点',
`location_latitude` decimal(10,7) COMMENT '签到地点纬度',
`location_longitude` decimal(10,7) COMMENT '签到地点经度',
`location_range` int DEFAULT 500 COMMENT '允许签到范围(米)',
-- 统计信息
`total_participants` int DEFAULT 0 COMMENT '应签到人数',
`checked_count` int DEFAULT 0 COMMENT '已签到人数',
`late_count` int DEFAULT 0 COMMENT '迟到人数',
`absent_count` int DEFAULT 0 COMMENT '缺席人数',
PRIMARY KEY (`id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_task_status` (`task_status`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤任务表';
字段说明
task_status: 0-未发起,1-进行中,2-已停止,3-已结束location_required: 0-不需要地理位置,1-需要地理位置
2.8 签到记录表(stgl_attendance_record)
表结构
CREATE TABLE `stgl_attendance_record` (
`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代表删除)',
-- 签到记录信息
`task_id` bigint(20) NOT NULL COMMENT '考勤任务ID',
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
-- 签到信息
`check_time` datetime COMMENT '签到时间',
`check_status` tinyint DEFAULT 0 COMMENT '签到状态(0-未签到 1-已签到 2-迟到)',
`check_latitude` decimal(10,7) COMMENT '签到纬度',
`check_longitude` decimal(10,7) COMMENT '签到经度',
`check_address` varchar(200) COMMENT '签到地址',
`device_type` tinyint COMMENT '设备类型(1-Web 2-移动端)',
`distance` int COMMENT '与标准位置距离(米)',
-- 签退信息(可选)
`checkout_time` datetime COMMENT '签退时间',
`checkout_latitude` decimal(10,7) COMMENT '签退纬度',
`checkout_longitude` decimal(10,7) COMMENT '签退经度',
`checkout_address` varchar(200) COMMENT '签退地址',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_user` (`task_id`, `user_id`, `deleted`),
KEY `idx_task_id` (`task_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_check_status` (`check_status`),
KEY `idx_check_time` (`check_time`),
KEY `idx_device_type` (`device_type`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='签到记录表';
字段说明
check_status: 0-未签到,1-已签到,2-迟到device_type: 1-Web端,2-移动端
2.9 材料收集任务表(stgl_material_task)
表结构
CREATE TABLE `stgl_material_task` (
`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代表删除)',
-- 收集任务信息
`activity_id` bigint(20) NOT NULL COMMENT '关联活动ID',
`task_name` varchar(100) NOT NULL COMMENT '收集任务名称',
`collection_types` varchar(100) NOT NULL COMMENT '收集类型(文本,附件,图片)',
`task_description` text COMMENT '收集说明',
`task_status` tinyint DEFAULT 1 COMMENT '任务状态(0-关闭 1-开启)',
`deadline` datetime COMMENT '截止时间',
`round_number` int DEFAULT 1 COMMENT '收集轮次',
-- 文件限制
`file_size_limit` int DEFAULT 10 COMMENT '文件大小限制(MB)',
`file_count_limit` int DEFAULT 5 COMMENT '文件数量限制',
`allowed_file_types` varchar(200) COMMENT '允许的文件类型',
-- 统计信息
`total_participants` int DEFAULT 0 COMMENT '应提交人数',
`submitted_count` int DEFAULT 0 COMMENT '已提交人数',
`pending_count` int DEFAULT 0 COMMENT '待提交人数',
PRIMARY KEY (`id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_task_status` (`task_status`),
KEY `idx_deadline` (`deadline`),
KEY `idx_round_number` (`round_number`),
KEY `idx_create_time` (`create_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='材料收集任务表';
字段说明
collection_types: 逗号分隔,如:文本,附件,图片task_status: 0-关闭,1-开启
2.10 材料提交记录表(stgl_material_submission)
表结构
CREATE TABLE `stgl_material_submission` (
`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代表删除)',
-- 提交记录信息
`task_id` bigint(20) NOT NULL COMMENT '收集任务ID',
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '提交人ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`submission_type` tinyint NOT NULL COMMENT '提交类型(1-个人 2-团队)',
`team_id` bigint(20) COMMENT '团队ID(团队提交时)',
-- 提交内容
`content_text` text COMMENT '文本内容',
`file_urls` json COMMENT '附件路径(JSON格式)',
`image_urls` json COMMENT '图片路径(JSON格式)',
`submission_time` datetime COMMENT '提交时间',
`round_number` int DEFAULT 1 COMMENT '提交轮次',
-- 审核信息(可选)
`review_status` tinyint DEFAULT 0 COMMENT '审核状态(0-待审核 1-通过 2-需修改)',
`review_time` datetime COMMENT '审核时间',
`review_by` bigint(20) COMMENT '审核人ID',
`review_remark` varchar(500) COMMENT '审核意见',
PRIMARY KEY (`id`),
KEY `idx_task_id` (`task_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_submission_type` (`submission_type`),
KEY `idx_team_id` (`team_id`),
KEY `idx_submission_time` (`submission_time`),
KEY `idx_round_number` (`round_number`),
KEY `idx_review_status` (`review_status`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='材料提交记录表';
字段说明
submission_type: 1-个人提交,2-团队提交review_status: 0-待审核,1-通过,2-需修改
2.11 活动评分表(stgl_activity_rating)
表结构
CREATE TABLE `stgl_activity_rating` (
`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代表删除)',
-- 评分信息
`activity_id` bigint(20) NOT NULL COMMENT '活动ID',
`user_id` bigint(20) NOT NULL COMMENT '评分人ID',
`student_no` varchar(20) COMMENT '学号',
`student_name` varchar(50) COMMENT '学生姓名',
`rating_score` decimal(3,1) NOT NULL COMMENT '综合评分(1-5分,保留1位小数)',
`rating_comment` varchar(500) COMMENT '评分备注',
`rating_time` datetime COMMENT '评分时间',
-- 扩展评分维度(预留)
`content_score` tinyint COMMENT '内容评分(1-5分)',
`organization_score` tinyint COMMENT '组织评分(1-5分)',
`experience_score` tinyint COMMENT '体验评分(1-5分)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`, `deleted`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_student_no` (`student_no`),
KEY `idx_rating_score` (`rating_score`),
KEY `idx_rating_time` (`rating_time`),
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动评分表';
字段说明
rating_score: 综合评分,1-5分,保留1位小数,由三项分评分平均值计算得出content_score、organization_score、experience_score: 三项分评分维度(内容、组织、体验),1-5分整数- 综合评分计算公式:
rating_score = ROUND((content_score + organization_score + experience_score) / 3, 1)
3. 码表数据设计
3.1 社团类型码表
-- 社团类型枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('社团类型', 'stgl_club_type', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '学术科技类', '学术科技类', 'stgl_club_type', '0', 1, NOW()),
(2, '文化艺术类', '文化艺术类', 'stgl_club_type', '0', 1, NOW()),
(3, '体育健身类', '体育健身类', 'stgl_club_type', '0', 1, NOW()),
(4, '实践技能类', '实践技能类', 'stgl_club_type', '0', 1, NOW()),
(5, '兴趣爱好类', '兴趣爱好类', 'stgl_club_type', '0', 1, NOW()),
(6, '思想政治类', '思想政治类', 'stgl_club_type', '0', 1, NOW());
3.2 活动类型码表
-- 活动类型枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('活动类型', 'stgl_activity_type', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '学术科技类', '学术科技类', 'stgl_activity_type', '0', 1, NOW()),
(2, '文化艺术类', '文化艺术类', 'stgl_activity_type', '0', 1, NOW()),
(3, '体育健身类', '体育健身类', 'stgl_activity_type', '0', 1, NOW()),
(4, '志愿公益类', '志愿公益类', 'stgl_activity_type', '0', 1, NOW()),
(5, '实践技能类', '实践技能类', 'stgl_activity_type', '0', 1, NOW()),
(6, '兴趣爱好类', '兴趣爱好类', 'stgl_activity_type', '0', 1, NOW()),
(7, '思想政治类', '思想政治类', 'stgl_activity_type', '0', 1, NOW());
3.3 活动状态码表
-- 活动状态枚举值
INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time) VALUES ('活动状态', 'stgl_activity_status', '0', 1, NOW());
INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time) VALUES
(1, '筹备中', '筹备中', 'stgl_activity_status', '0', 1, NOW()),
(2, '待审批', '待审批', 'stgl_activity_status', '0', 1, NOW()),
(3, '已通过', '已通过', 'stgl_activity_status', '0', 1, NOW()),
(4, '进行中', '进行中', 'stgl_activity_status', '0', 1, NOW()),
(5, '已结束', '已结束', 'stgl_activity_status', '0', 1, NOW()),
(6, '已取消', '已取消', 'stgl_activity_status', '0', 1, NOW()),
(7, '已驳回', '已驳回', 'stgl_activity_status', '0', 1, NOW());
4. 索引优化策略
4.1 索引设计原则
- 主键索引: 所有表使用bigint类型的雪花ID作为主键
- 唯一索引: 对业务唯一性约束添加唯一索引
- 复合索引: tenant_id + deleted 支持多租户和软删除
- 查询索引: 针对常用查询条件添加索引
- 时间索引: 时间字段添加索引支持时间范围查询
4.2 重要索引说明
- 社团名称唯一性:
uk_club_name确保同租户下社团名称唯一 - 活动查询优化: 多个时间和状态索引支持复杂查询
- 报名记录唯一性:
uk_activity_user确保用户不能重复报名同一活动 - 签到记录唯一性:
uk_task_user确保用户不能重复签到同一任务 - 评分记录唯一性:
uk_activity_user确保用户不能重复评分同一活动
5. 数据完整性约束
5.1 外键关系
stgl_member.relation_id→stgl_club.id或stgl_volunteer_team.idstgl_activity.related_club_id→stgl_club.idstgl_activity_registration.activity_id→stgl_activity.idstgl_activity_registration.team_id→stgl_team_info.idstgl_attendance_task.activity_id→stgl_activity.idstgl_attendance_record.task_id→stgl_attendance_task.idstgl_material_task.activity_id→stgl_activity.idstgl_material_submission.task_id→stgl_material_task.idstgl_activity_rating.activity_id→stgl_activity.id
5.2 业务约束
- 社团名称在同一租户下必须唯一
- 用户不能重复报名同一活动
- 用户不能重复签到同一考勤任务
- 用户不能重复评分同一活动
- 团队成员数量不能超过活动设置的上限
6. 性能优化建议
6.1 查询优化
- 分页查询使用覆盖索引避免回表
- 复杂统计查询考虑创建物化视图
- JSON字段查询使用虚拟列索引
- 时间范围查询合理使用分区表
6.2 存储优化
- 大文本字段(description、summary等)考虑分离存储
- 图片和文件路径使用相对路径减少存储
- JSON字段压缩存储减少空间占用
6.3 缓存策略
- 社团信息、活动信息等相对稳定数据适合缓存
- 实时性要求高的签到、报名数据慎用缓存
- 统计数据可以使用定时刷新的缓存
这个数据库设计为社团管理系统提供了完整的数据存储方案,支持所有业务需求并具有良好的可扩展性和性能。