万岳教育系统数据库设计详解:表结构与关系模型分析
万岳教育系统作为集知识付费、直播授课、在线教育功能为一体的平台,其数据库设计直接影响系统性能与扩展性。本文基于edu_sdwanyue_web-20230113/data/config/database.php配置及核心模型文件,深入分析数据库表结构设计与实体关系模型。
数据库基础配置
系统采用MySQL数据库,配置文件定义了核心连接参数:
- 数据库类型:
mysql - 表前缀:
cmf_(用于区分多模块表) - 字符集:
utf8mb4(支持 emoji 与复杂字符) - 缓存层:集成Redis(edu_sdwanyue_web-20230113/data/config/database.php#L39-L44)
核心业务表结构
1. 课程模块设计
课程表(cmf_course)是系统核心,对应模型文件edu_sdwanyue_web-20230113/app/admin/model/CourseModel.php。虽未直接定义字段,但通过关联模型可推断核心字段:
- 基础信息:
id(主键)、title(课程名称)、price(价格)、status(状态) - 关联字段:
teacher_id(讲师ID)、category_id(分类ID) - 时间戳:
create_time、update_time
2. 用户与权限体系
用户模块涉及多角色设计,主要模型包括:
- UsersModel:存储用户基础信息
- UserModel:扩展用户资料与权限
核心用户表(cmf_users)字段推测:
id: int(11) PK
user_login: varchar(60) 用户名
user_pass: varchar(64) 密码哈希
user_nickname: varchar(50) 昵称
role_id: int(11) 角色ID(关联权限表)
avatar: varchar(255) 头像URL
3. 内容管理模块
文章/页面管理通过PortalPostModel实现,对应表cmf_portal_post,支持:
- 富文本内容:
post_content字段(PortalPostModel.php#L62-L65) - 多媒体资源:
more字段存储缩略图、音频、视频URL(PortalPostModel.php#L102-L113)
实体关系模型(ERM)
1. 多对多关系实现
课程与用户的报名关系通过中间表cmf_course_users实现,对应模型CourseUsersModel,结构如下:
course_id: int(11) FK -> cmf_course.id
user_id: int(11) FK -> cmf_users.id
join_time: int(11) 报名时间
status: tinyint(1) 学习状态
2. 内容分类体系
文章/课程分类采用多对多设计:
- 分类表:
cmf_portal_category - 中间表:
cmf_portal_category_post(PortalPostModel.php#L45) - 模型关联:
belongsToMany(PortalPostModel.php#L43-L46)
3. 标签系统设计
内容标签通过cmf_portal_tag和cmf_portal_tag_post表实现,支持一篇文章多个标签:
性能优化策略
1. 索引设计
关键查询字段建立索引:
- 用户表:
user_login(唯一索引)、role_id(普通索引) - 课程表:
teacher_id(联合索引)、category_id,status(复合索引) - 中间表:
course_id,user_id(联合主键)
2. 读写分离
配置文件预留了主从分离扩展点,可通过修改database.php实现:
// 主从配置示例
'read' => [
'hostname' => 'slave1.database.com,slave2.database.com'
],
'write' => [
'hostname' => 'master.database.com'
]
3. 缓存策略
Redis配置用于热点数据缓存(database.php#L39-L44),典型应用场景:
- 课程列表缓存(键:
course:list:{category_id}) - 用户权限缓存(键:
user:role:{user_id})
数据安全设计
1. 密码存储
采用单向哈希算法,参考UsersModel的密码处理逻辑:
// 密码加密示例
public function setPasswordAttr($value) {
return password_hash($value, PASSWORD_DEFAULT);
}
2. 数据备份
系统通过定时任务(推测由node/timer.js实现)执行数据库备份,建议备份策略:
- 每日全量备份
- 实时binlog日志备份
- 异地容灾存储
扩展建议
1. 分表策略
对于大型部署,建议对以下表实施分表:
- 课程记录表:按
course_id范围分表 - 日志表:按时间分表(如
cmf_log_202310)
2. 时序数据优化
学习行为数据可迁移至时序数据库(如InfluxDB),通过plugins/qiniu/QiniuPlugin.php实现数据同步。
总结
万岳教育系统数据库设计遵循以下原则:
- 模块化:按业务领域划分表结构(课程、用户、内容)
- 松耦合:通过中间表实现多对多关系
- 可扩展:预留缓存层与分表扩展点
完整表结构可通过数据库迁移文件或执行以下命令导出:
cd edu_sdwanyue_web-20230113 && php think migrate:run
建议开发者结合think命令行工具生成数据字典,辅助系统维护与二次开发。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




