手把手教你写项目之中小学微课学习系统(二):数据库设计-万丈高楼的地基

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

效果预览:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

02-数据库设计-万丈高楼的地基

各位小伙伴,咱们的后端项目已经像一个新生儿一样,发出了第一声啼哭(成功启动了!)。但是,一个系统光有“骨架”是远远不够的,它还需要“血液”和“记忆”——也就是数据。今天,咱们就来干一件极其重要的事情:为我们的微课学习系统设计数据库,也就是打地基!

为啥说数据库设计是地基呢?你想想,房子要是地基没打好,楼盖得越高,塌得越快。项目也是一样,如果数据库表结构设计得一团糟,后期业务逻辑不管多牛,都会被糟糕的性能和无穷无尽的bug拖垮。这里千万不要学我当初直接“梭哈”,想到啥字段加啥字段,后期重构起来简直是“火葬场”。

核心业务分析

在设计表之前,我们得先像个“产品经理”一样,分析一下我们系统的核心功能,说白了就是“这个系统是干啥的?”。

  1. 用户:系统得有人用吧?得分两种:学生管理员(或者叫老师)。他们都需要登录、注册。
  2. 课程:系统得有学习内容,也就是课程。课程有名称简介封面图片等。
  3. 课程分类:课程不能乱糟糟一堆,得有个分类,比如“小学语文”、“初中数学”。
  4. 课时/视频:一门课程里,应该包含很多个课时,每个课时对应一个教学视频

好了,核心的角色和实体我们已经抓出来了:用户课程分类课程课时。接下来,我们就要把这些实体,变成数据库里实实在在的表。

表结构设计(ER图)

Talk is cheap,直接上图!我用Mermaid给大家画了一个实体关系图(ER图),清晰地展示了各个表之间的“爱恨情仇”。

USER bigint id PK 用户ID varchar username 用户名 varchar password 密码 varchar role 角色 (student/admin) datetime created_at 创建时间 CATEGORY bigint id PK 分类ID varchar name 分类名称 int sort_order 排序字段 COURSE bigint id PK 课程ID varchar title 课程标题 text description 课程描述 varchar cover_image_url 封面图URL bigint category_id FK 外键->分类ID datetime created_at 创建时间 LESSON bigint id PK 课时ID varchar title 课时标题 varchar video_url 视频URL int duration_in_seconds 视频时长(秒) bigint course_id FK 外键->课程ID int lesson_number 课时编号 管理员创建 包含 包含

图解时间到!

  • USER(用户表):存放我们的学生和管理员信息。role字段是关键,用来区分用户身份。
  • CATEGORY(课程分类表):存放“小学语文”、“初中数学”这些分类。
  • COURSE(课程表):核心表之一,存放课程的详细信息。它通过 category_id 这个“外键”,和 CATEGORY 表关联起来,表示这个课程属于哪个分类。
  • LESSON(课时表):存放具体的视频课时信息。它通过 course_idCOURSE 表关联,表示这个课时属于哪一门课程。

大家注意看图中的连线:

  • 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值