MySQL数据库基础练习系列目标
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
数据库环境
MySQL版本:5.7.31-log
数据库字符集,所有数据库通用字符集与排序规则,支持中文数据。
字符集:utf8
排序规则:utf8_general_ci
使用工具:Navicat Premium 15,可以在下面的连接中下载
https://download.csdn.net/download/feng8403000/89403778
项目名称与项目简介
博客评论系统是一个在线平台,允许博客作者发布文章,并且读者可以浏览这些文章,对文章进行评论和回复。该系统旨在提供一个互动的环境,让读者与作者之间能够进行交流,分享观点和想法。系统主要包括以下几个核心功能:
用户管理:允许用户注册、登录、修改个人信息和查看个人信息。
文章管理:博客作者可以发布、编辑和删除自己的文章。
评论管理:读者可以对文章进行评论,也可以回复其他评论。作者和管理员可以对评论进行审核和管理。
互动功能:支持点赞、踩等互动操作,让读者能够表达自己对评论或文章的喜好。
数据库DDL(注意创建顺序)
为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。
-- 创建用户表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
gender ENUM('男', '女') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建文章表
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
author_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 创建评论表
CREATE TABLE comments (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
user_id INT NOT NULL,
article_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (article_id) REFERENCES articles(id) ON DELETE CASCADE
);
-- 创建回复表
CREATE TABLE replies (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
user_id INT NOT NULL,
comment_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE
);
-- 创建点赞表
CREATE TABLE likes (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
comment_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE,
UNIQUE (user_id, comment_id) -- 确保每个用户只能对每条评论点赞一次
);
属性注释
用户表(users)
id:用户唯一标识符,自动增长的主键。
username:用户名,用于登录和识别用户,不可为空且唯一。
password:用户密码,存储时应进行加密处理,不可为空。
email:用户邮箱地址,用于接收通知或找回密码等,不可为空且唯一。
gender:用户性别,枚举类型,取值为'男'或'女',不可为空。
created_at:用户创建时间,默认为当前时间戳。
文章表(articles)
id:文章唯一标识符,自动增长的主键。
title:文章标题,不可为空。
content:文章内容,文本类型,不可为空。
author_id:文章作者的用户ID,外键关联到用户表的id字段,不可为空。当对应用户被删除时,文章也会被级联删除。
created_at:文章创建时间,默认为当前时间戳。
评论表(comments)
id:评论唯一标识符,自动增长的主键。
content:评论内容,文本类型,不可为空。
user_id:发表评论的用户ID,外键关联到用户表的id字段,不可为空。当对应用户被删除时,评论也会被级联删除。
article_id:评论所属的文章ID,外键关联到文章表的id字段,不可为空。当对应文章被删除时,评论也会被级联删除。
created_at:评论创建时间,默认为当前时间戳。
回复表(replies)
id:回复唯一标识符,自动增长的主键。
content:回复内容,文本类型,不可为空。
user_id:发表回复的用户ID,外键关联到用户表的id字段,不可为空。当对应用户被删除时,回复也会被级联删除。
comment_id:回复所针对的评论ID,外键关联到评论表的id字段,不可为空。当对应评论被删除时,回复也会被级联删除。
created_at:回复创建时间,默认为当前时间戳。
点赞表(likes)
id:点赞唯一标识符,自动增长的主键。
user_id:点赞用户的ID,外键关联到用户表的id字段,不可为空。当对应用户被删除时,点赞记录也会被级联删除。
comment_id:被点赞的评论ID,外键关联到评论表的id字段,不可为空。当对应评论被删除时,点赞记录也会被级联删除。
created_at:点赞创建时间,默认为当前时间戳。
UNIQUE (user_id, comment_id):唯一约束,确保每个用户只能对每条评论点赞一次。
插入数据DML(注意插入数据顺序)
插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。
-- 插入用户数据(使用明星姓名)
INSERT INTO users (username, password, email, gender) VALUES
('刘德华', 'password1', 'liudehua@example.com', '男'),
('周润发', 'password2', 'zhouyunfa@example.com', '男'),
('王菲', 'password3', 'wangfei@example.com', '女'),
('周杰伦', 'password4', 'zhoujielun@example.com', '男'),
('章子怡', 'password5', 'zhangziyi@example.com', '女');
-- 插入文章数据(关于夏天太热的话题)
INSERT INTO articles (title, content, author_id) VALUES
('如何应对炎炎夏日', '夏天太热,如何才能舒适度过...', 1),
('防晒小技巧', '炎炎夏日,如何有效防晒...', 2),
('夏日清凉食谱', '分享几款夏日消暑美食...', 3),
('夏季运动注意事项', '夏天运动,这些事项你需要注意...', 4),
('夏日护肤心得', '夏天如何保养肌肤,保持水润...', 5);
-- 插入评论数据(对文章进行评论,内容关于夏天太热)
INSERT INTO comments (content, user_id, article_id) VALUES
('夏天真的太热了,求降温秘诀!', 2, 1), -- 周润发对“如何应对炎炎夏日”的评论
('每天都需要涂防晒霜,不然晒伤太难受了。', 3, 2), -- 王菲对“防晒小技巧”的评论
('推荐大家试试绿豆汤,消暑又美味!', 4, 3), -- 周杰伦对“夏日清凉食谱”的评论
('夏天运动容易中暑,大家要小心。', 5, 4), -- 章子怡对“夏季运动注意事项”的评论
('夏天皮肤容易干燥,保湿工作要做好。', 1, 5); -- 刘德华对“夏日护肤心得”的评论
-- 插入回复数据(对评论进行回复,内容依然与夏天太热相关)
INSERT INTO replies (content, user_id, comment_id) VALUES
('可以试试多喝水,保持身体水分。', 4, 1), -- 周杰伦回复周润发对“如何应对炎炎夏日”的评论
('确实,防晒很重要,还要注意遮阳。', 5, 2), -- 章子怡回复王菲对“防晒小技巧”的评论
('绿豆汤是个好选择,我也经常喝。', 1, 3), -- 刘德华回复周杰伦对“夏日清凉食谱”的评论
('谢谢提醒,我会注意的。', 2, 4), -- 周润发回复章子怡对“夏季运动注意事项”的评论
('保湿工作真的很重要,我每天都用保湿霜。', 3, 5); -- 王菲回复刘德华对“夏日护肤心得”的评论
-- 插入点赞数据(对评论进行点赞)
INSERT INTO likes (user_id, comment_id) VALUES
(3, 1), -- 王菲点赞周润发对“如何应对炎炎夏日”的评论
(5, 2), -- 章子怡点赞王菲对“防晒小技巧”的评论
(1, 3), -- 刘德华点赞周杰伦对“夏日清凉食谱”的评论
(4, 4), -- 周杰伦点赞章子怡对“夏季运动注意事项”的评论
(2, 5); -- 周润发点赞刘德华对“夏日护肤心得”的评论
遵循的数据库三范式
数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:
第一范式(1NF, First Normal Form)
定义:
列不可分割,即数据库表的每一列都是不可分割的原子数据项。
每一列都是不可再分的最小数据单元(也称为最小的原子单元)。
解释:
-
在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
-
例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。
第二范式(2NF, Second Normal Form)
定义:
满足1NF。
非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。
解释:
-
第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
-
在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
-
如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。
第三范式(3NF, Third Normal Form)
定义:
满足2NF。
非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。
解释:
-
第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
-
如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。