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 resumes (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
resume_name VARCHAR(100) NOT NULL,
resume_file VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 创建教育经历表,与简历表关联
CREATE TABLE education_histories (
id INT AUTO_INCREMENT PRIMARY KEY,
resume_id INT NOT NULL,
start_year INT NOT NULL,
end_year INT,
school_name VARCHAR(100) NOT NULL,
degree VARCHAR(50) NOT NULL,
major VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (resume_id) REFERENCES resumes(id) ON DELETE CASCADE
);
-- 创建工作经历表,与简历表关联
CREATE TABLE work_experiences (
id INT AUTO_INCREMENT PRIMARY KEY,
resume_id INT NOT NULL,
company_name VARCHAR(100) NOT NULL,
position VARCHAR(50) NOT NULL,
start_date DATE NOT NULL,
end_date DATE,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (resume_id) REFERENCES resumes(id) ON DELETE CASCADE
);
-- 创建技能表,与简历表关联
CREATE TABLE skills (
id INT AUTO_INCREMENT PRIMARY KEY,
resume_id INT NOT NULL,
skill_name VARCHAR(50) NOT NULL,
skill_level ENUM('初级', '中级', '高级') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (resume_id) REFERENCES resumes(id) ON DELETE CASCADE
);
-- 创建求职意向表,与用户表关联
CREATE TABLE job_intentions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
position VARCHAR(50) NOT NULL,
industry VARCHAR(50),
location VARCHAR(50),
salary VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
属性介绍
users 表
id
: 用户ID,自动增长的主键。
username
: 用户名,不能为空且唯一,最大长度为50个字符。
password
: 用户密码,不能为空,最大长度为255个字符。
gender
: 用户性别,枚举类型,可选值为'男'和'女',不能为空。
created_at
: 用户创建时间,默认为当前时间戳。resumes 表
id
: 简历ID,自动增长的主键。
user_id
: 用户ID,外键,关联到users表的id字段,不能为空。
resume_name
: 简历名称,不能为空,最大长度为100个字符。
resume_file
: 简历文件路径或名称,不能为空,最大长度为255个字符。
created_at
: 简历创建时间,默认为当前时间戳。education_histories 表
id
: 教育经历ID,自动增长的主键。
resume_id
: 简历ID,外键,关联到resumes表的id字段,不能为空。
start_year
: 入学年份,不能为空。
end_year
: 毕业年份,可以为空(例如对于在读学生)。
school_name
: 学校名称,不能为空,最大长度为100个字符。
degree
: 学位或学历,不能为空,最大长度为50个字符。
major
: 专业,可以为空,最大长度为50个字符。
created_at
: 教育经历创建时间,默认为当前时间戳。work_experiences 表
id
: 工作经历ID,自动增长的主键。
resume_id
: 简历ID,外键,关联到resumes表的id字段,不能为空。
company_name
: 公司名称,不能为空,最大长度为100个字符。
position
: 职位名称,不能为空,最大长度为50个字符。
start_date
: 入职日期,不能为空。
end_date
: 离职日期,可以为空(例如对于当前职位)。
description
: 工作描述或职责,可以为空,最大长度为文本长度。
created_at
: 工作经历创建时间,默认为当前时间戳。skills 表
id
: 技能ID,自动增长的主键。
resume_id
: 简历ID,外键,关联到resumes表的id字段,不能为空。
skill_name
: 技能名称,不能为空,最大长度为50个字符。
skill_level
: 技能等级,枚举类型,可选值为'初级'、'中级'和'高级',不能为空。
created_at
: 技能创建时间,默认为当前时间戳。job_intentions 表
id
: 求职意向ID,自动增长的主键。
user_id
: 用户ID,外键,关联到users表的id字段,不能为空。
position
: 期望职位,不能为空,最大长度为50个字符。
industry
: 期望行业,可以为空,最大长度为50个字符。
location
: 期望工作地点,可以为空,最大长度为50个字符。
salary
: 期望薪资,可以为空,最大长度为50个字符(通常以范围或具体数值表示)。
created_at
: 求职意向创建时间,默认为当前时间戳。
插入数据DML(注意插入数据顺序)
插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。
-- 插入用户数据
INSERT INTO users (username, password, email, gender) VALUES
('令狐冲', 'linghubuchong123', 'linghubuchong@example.com', '男'),
('任盈盈', 'renyingying456', 'renyingying@example.com', '女'),
('岳不群', 'yuebuqun789', 'yuebuqun@example.com', '男'),
('宁中则', 'ningzhongze012', 'ningzhongze@example.com', '女'),
('林平之', 'linpingzhi345', 'linpingzhi@example.com', '男');
-- 插入简历数据
INSERT INTO resumes (user_id, resume_name, resume_file) VALUES
(1, '令狐冲个人履历', 'linghubuchong_resume.pdf'),
(2, '任盈盈求职简历', 'renyingying_resume.docx'),
(3, '岳不群工作履历', 'yuebuqun_resume.xlsx'),
(4, '宁中则职业经历', 'ningzhongze_resume.pptx'),
(5, '林平之求职资料', 'linpingzhi_resume.txt');
-- 插入教育经历数据
INSERT INTO education_histories (resume_id, start_year, end_year, school_name, degree, major) VALUES
(1, 2010, 2013, '华山职业学院', '大专', '武术'),
(1, 2014, 2016, '嵩山少林学院', '本科', '少林功夫'),
(2, 2012, 2015, '日月神教学院', '大专', '暗器'),
(3, 2011, 2014, '恒山女子学院', '大专', '剑法'),
(4, 2013, 2016, '武当山职业学院', '本科', '内功心法'),
(5, 2014, 2017, '青城山武校', '大专', '剑法');
-- 插入工作经历数据
INSERT INTO work_experiences (resume_id, company_name, position, start_date, end_date, description) VALUES
(1, '五岳剑派联盟', '首席剑客', '2017-01-01', NULL, '负责五岳剑派剑法交流'),
(2, '日月神教', '圣姑助理', '2016-05-01', '2018-12-31', '协助圣姑管理教务'),
(3, '华山派', '掌门大弟子', '2015-09-01', NULL, '负责门派日常事务'),
(4, '恒山派', '大师姐', '2017-03-01', '2019-02-28', '传授剑法给师妹们'),
(5, '福威镖局', '镖师', '2018-06-01', NULL, '负责押送镖物');
-- 插入技能数据
INSERT INTO skills (resume_id, skill_name, skill_level) VALUES
(1, '独孤九剑', '高级'),
(1, '易筋经', '中级'),
(2, '绣花针', '高级'),
(2, '暗器', '中级'),
(3, '紫霞神功', '中级'),
(3, '剑法', '高级'),
(4, '恒山剑法', '中级'),
(4, '疗伤', '初级'),
(5, '辟邪剑法', '高级'),
(5, '轻功', '中级');
-- 插入求职意向数据
INSERT INTO job_intentions (user_id, position, industry, location, salary) VALUES
(1, '剑客', '武林', '华山', '面议'),
(2, '教务管理', '教育', '日月神教', '面议'),
(3, '掌门', '武林', '华山', '面议'),
(4, '剑法教师', '教育', '恒山', '面议'),
(5, '镖师', '物流', '福州', '面议');
遵循的数据库三范式
数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:
第一范式(1NF, First Normal Form)
定义:
列不可分割,即数据库表的每一列都是不可分割的原子数据项。
每一列都是不可再分的最小数据单元(也称为最小的原子单元)。
解释:
-
在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
-
例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。
第二范式(2NF, Second Normal Form)
定义:
满足1NF。
非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。
解释:
-
第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
-
在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
-
如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。
第三范式(3NF, Third Normal Form)
定义:
满足2NF。
非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。
解释:
-
第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
-
如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。