阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!
效果预览:





02-数据库设计-万丈高楼的地基
各位小伙伴,咱们的后端项目已经像一个新生儿一样,发出了第一声啼哭(成功启动了!)。但是,一个系统光有“骨架”是远远不够的,它还需要“血液”和“记忆”——也就是数据。今天,咱们就来干一件极其重要的事情:为我们的微课学习系统设计数据库,也就是打地基!
为啥说数据库设计是地基呢?你想想,房子要是地基没打好,楼盖得越高,塌得越快。项目也是一样,如果数据库表结构设计得一团糟,后期业务逻辑不管多牛,都会被糟糕的性能和无穷无尽的bug拖垮。这里千万不要学我当初直接“梭哈”,想到啥字段加啥字段,后期重构起来简直是“火葬场”。
核心业务分析
在设计表之前,我们得先像个“产品经理”一样,分析一下我们系统的核心功能,说白了就是“这个系统是干啥的?”。
- 用户:系统得有人用吧?得分两种:
学生和管理员(或者叫老师)。他们都需要登录、注册。 - 课程:系统得有学习内容,也就是
课程。课程有名称、简介、封面图片等。 - 课程分类:课程不能乱糟糟一堆,得有个
分类,比如“小学语文”、“初中数学”。 - 课时/视频:一门课程里,应该包含很多个
课时,每个课时对应一个教学视频。
好了,核心的角色和实体我们已经抓出来了:用户、课程分类、课程、课时。接下来,我们就要把这些实体,变成数据库里实实在在的表。
表结构设计(ER图)
Talk is cheap,直接上图!我用Mermaid给大家画了一个实体关系图(ER图),清晰地展示了各个表之间的“爱恨情仇”。
图解时间到!
USER(用户表):存放我们的学生和管理员信息。role字段是关键,用来区分用户身份。CATEGORY(课程分类表):存放“小学语文”、“初中数学”这些分类。COURSE(课程表):核心表之一,存放课程的详细信息。它通过category_id这个“外键”,和CATEGORY表关联起来,表示这个课程属于哪个分类。LESSON(课时表):存放具体的视频课时信息。它通过course_id和COURSE表关联,表示这个课时属于哪一门课程。
大家注意看图中的连线:
CATEGORY ||--|{ COURSE:表示一个分类(CATEGORY)下可以包含多个课程(COURSE)。COURSE ||--|{ LESSON:表示一门课程(COURSE)下可以包含多个课时(LESSON)。USER ||--o{ COURSE:这个稍微特殊点,表示一个管理员(USER)可以创建多个课程(COURSE),但课程不一定非要和某个管理员强绑定(比如管理员离职了),所以用了虚线。
创建SQL脚本
光说不练假把式。下面就是根据我们设计的ER图,编写出的可以在MySQL中直接执行的SQL脚本。大家可以打开自己的MySQL客户端(比如Navicat、DBeaver等),新建一个名为 weke_learning 的数据库,然后执行下面的脚本。
-- ----------------------------
-- 数据库: weke_learning
-- ----------------------------
CREATE DATABASE IF NOT EXISTS `weke_learning` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `weke_learning`;
-- ----------------------------
-- 表结构 `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名',
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码(加密后)',
`role` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'student' COMMENT '角色 (student/admin)',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- ----------------------------
-- 表结构 `category`
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分类名称',
`sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程分类表';
-- ----------------------------
-- 表结构 `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '课程ID',
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程标题',
`description` text COLLATE utf8mb4_unicode_ci COMMENT '课程描述',
`cover_image_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '封面图URL',
`category_id` bigint(20) NOT NULL COMMENT '分类ID',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程表';
-- ----------------------------
-- 表结构 `lesson`
-- ----------------------------
DROP TABLE IF EXISTS `lesson`;
CREATE TABLE `lesson` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '课时ID',
`course_id` bigint(20) NOT NULL COMMENT '课程ID',
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课时标题',
`video_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '视频URL',
`duration_in_seconds` int(11) DEFAULT '0' COMMENT '视频时长(秒)',
`lesson_number` int(11) NOT NULL DEFAULT '1' COMMENT '课时编号(用于排序)',
PRIMARY KEY (`id`),
KEY `idx_course_id` (`course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课时表';
好了,到此为止,我们项目的“地基”算是稳稳当当地打好了。有了这些表,我们的用户数据、课程数据就都有了“家”。
下一期预告: 数据表已经建好,是时候让我们的Java代码和数据库“认识”一下了。下一章,我们将正式开始编码,从最基础的“用户模块”入手,实现用户的增删改查(CRUD),打通后端逻辑的“任督二脉”!敬请期待!
源码下载地址:
https://download.youkuaiyun.com/download/THMAIL/91753658

1704

被折叠的 条评论
为什么被折叠?



