MySQL数据库基础练习系列目标
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
数据库环境
MySQL版本:5.7.31-log
数据库字符集,所有数据库通用字符集与排序规则,支持中文数据。
字符集:utf8 排序规则:utf8_general_ci
使用工具:Navicat Premium 15,可以在下面的连接中下载
https://download.csdn.net/download/feng8403000/89403778
项目名称与项目简介
留言板系统是一个允许用户发表留言、回复其他用户留言、查看留言及回复的交互式平台。该系统主要实现以下功能:
- 用户注册与登录:用户需注册后才能使用系统,包括用户名、密码、邮箱等基本信息的录入。登录后,用户可管理自己的个人信息。
- 发表留言:注册用户可在指定板块发表自己的留言,包括标题、内容等。
- 留言回复:用户可查看其他用户的留言,并对其进行回复。
- 留言管理:管理员或用户本人可对留言进行删除、编辑等操作。
- 搜索与排序:用户可根据关键词搜索留言,并可按照时间、点赞数等条件对留言进行排序。
数据库DDL(注意创建顺序)
为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。
代码语言:javascript复制-- 创建用户表
CREATE TABLE users (
-- 用户ID,自增主键
user_id INT AUTO_INCREMENT PRIMARY KEY,
-- 用户名,唯一且不能为空
username VARCHAR(50) NOT NULL UNIQUE,
-- 用户密码,不能为空
`password` VARCHAR(255) NOT NULL,
-- 用户邮箱,唯一且可以为空(根据实际情况可设为NOT NULL)
email VARCHAR(100) UNIQUE,
-- 用户性别,可以是'男'或'女',长度为2个字符
-- 这里直接使用了VARCHAR类型存储性别,并设置默认值为'男'
sex VARCHAR(2) DEFAULT '男'
);
-- 创建板块表
CREATE TABLE boards (
-- 板块ID,自增主键
board_id INT AUTO_INCREMENT PRIMARY KEY,
-- 板块名称,唯一且不能为空
board_name VARCHAR(100) NOT NULL UNIQUE
-- 可以添加其他板块属性,如板块描述、创建时间等
-- 例如:description TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建留言表
CREATE TABLE messages (
-- 留言ID,自增主键
message_id INT AUTO_INCREMENT PRIMARY KEY,
-- 用户ID,外键关联users表
user_id INT,
-- 板块ID,外键关联boards表
board_id INT,
-- 留言标题,不能为空
title VARCHAR(255) NOT NULL,
-- 留言内容,不能为空
content TEXT NOT NULL,
-- 留言创建时间,默认为当前时间戳
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 设置外键约束,确保引用的数据存在
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (board_id) REFERENCES boards(board_id)
-- 可以添加其他留言属性,如点赞数、浏览量等
-- 例如:likes INT DEFAULT 0, views INT DEFAULT 0
);
-- 创建回复表
CREATE TABLE replies (
-- 回复ID,自增主键
reply_id INT AUTO_INCREMENT PRIMARY KEY,
-- 留言ID,外键关联messages表
message_id INT,
-- 用户ID,外键关联users表
user_id INT,
-- 回复内容,不能为空
content TEXT NOT NULL,
-- 回复创建时间,默认为当前时间戳
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 设置外键约束,确保引用的数据存在
FOREIGN KEY (message_id) REFERENCES messages(message_id),
FOREIGN KEY (user_id) REFERENCES users(user_id)
-- 可以添加其他回复属性,如点赞数、是否显示等
-- 例如:is_displayed BOOLEAN DEFAULT TRUE
);
插入数据DML(注意插入数据顺序)
插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。
代码语言:javascript复制INSERT INTO users (username, `password`, email, sex) VALUES
('张三', '123456', 'zhangsan@example.com', '男'),
('李四', 'password1', 'lisi@example.com', '男'),
('王五', 'qwerty', 'wangwu@example.com', '女'),
('赵六', 'secret', 'zhaoliu@example.com', '男'),
('孙七', '1a2b3c', 'sunqi@example.com', '女');
INSERT INTO boards (board_name) VALUES
('技术交流'),
('生活分享'),
('旅行攻略'),
('读书心得'),
('美食天地');
INSERT INTO messages (user_id, board_id, title, content) VALUES
(1, 1, '新技术探讨', '这里有一些关于新技术的讨论内容...'),
(2, 2, '生活小技巧', '分享一些生活中的小技巧...'),
(3, 3, '我的旅行经历', '这是我去年去日本的旅行经历...'),
(4, 4, '推荐一本好书', '这本书真的很不错,推荐给大家...'),
(5, 5, '美食推荐', '最近发现了一家超好吃的餐厅...');
INSERT INTO replies (message_id, user_id, content) VALUES
(1, 2, '对新技术很感兴趣,能详细说说吗?'),
(2, 3, '这些技巧确实很实用,谢谢分享!'),
(3, 5, '我也去过日本,你去了哪些地方呢?'),
(4, 1, '这本书我已经读过了,确实很值得一读。'),
(1, 4, '新技术方面我可以给你一些建议。');
遵循的数据库三范式
数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:
第一范式(1NF, First Normal Form)
定义:
- 列不可分割,即数据库表的每一列都是不可分割的原子数据项。
- 每一列都是不可再分的最小数据单元(也称为最小的原子单元)。
解释:
- 在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
- 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。
第二范式(2NF, Second Normal Form)
定义:
- 满足1NF。
- 非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。
解释:
- 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
- 在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
- 如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。
第三范式(3NF, Third Normal Form)
定义:
- 满足2NF。
- 非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。
解释:
- 第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
- 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。