前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据库基础练习系列40、报销审批系统

MySQL数据库基础练习系列40、报销审批系统

作者头像
红目香薰
发布2024-06-16 12:27:02
630
发布2024-06-16 12:27:02
举报
文章被收录于专栏:CSDNToQQCodeCSDNToQQCode

MySQL数据库基础练习系列目标

很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。

数据库环境

MySQL版本:5.7.31-log

数据库字符集,所有数据库通用字符集与排序规则,支持中文数据。

字符集:utf8 排序规则:utf8_general_ci

使用工具:Navicat Premium 15,可以在下面的连接中下载

https://download.csdn.net/download/feng8403000/89403778

项目名称与项目简介

报销审批系统是一个用于处理员工报销申请、审批及记录的系统。该系统通过电子化流程,简化了报销过程,提高了审批效率,并方便管理者对报销情况进行统计和分析。

系统的主要功能包括:

  1. 用户管理:记录系统用户的基本信息,如姓名、性别、部门等。
  2. 报销申请:员工提交报销申请,包括报销金额、报销类型、报销事由等。
  3. 审批流程:设置报销申请的审批流程,指定各级审批人及审批条件。
  4. 审批操作:各级审批人对报销申请进行审批操作,包括同意、驳回等。
  5. 报销记录:记录报销申请的审批结果及最终报销金额等信息。

数据库DDL(注意创建顺序)

为了直接运行DDL语句并创建表,我们需要确保在创建含有外键约束的表之前,相关的被引用表(即外键指向的表)已经存在。所以我们在创建表的时候一定要按照一定的顺序来创建,否则就会出现没有外键关系导致的创建异常。

代码语言:javascript
复制
CREATE TABLE Users (
    user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
    name VARCHAR(100) NOT NULL COMMENT '用户名',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    department VARCHAR(100) NOT NULL COMMENT '部门'
);

CREATE TABLE ExpenseTypes (
    type_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '费用类型ID',
    type_name VARCHAR(100) NOT NULL COMMENT '费用类型名称'
);

CREATE TABLE ExpenseClaims (
    claim_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '报销申请ID',
    user_id INT NOT NULL COMMENT '用户ID',
    expense_date DATE NOT NULL COMMENT '费用日期',
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额',
    claim_description TEXT COMMENT '报销描述',
    status ENUM('待审批', '已审批', '已驳回') NOT NULL DEFAULT '待审批' COMMENT '报销状态',
    FOREIGN KEY (user_id) REFERENCES Users(user_id)
);

CREATE TABLE ExpenseDetails (
    detail_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '费用明细ID',
    claim_id INT NOT NULL COMMENT '报销申请ID',
    type_id INT NOT NULL COMMENT '费用类型ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '金额',
    expense_description TEXT COMMENT '费用描述',
    FOREIGN KEY (claim_id) REFERENCES ExpenseClaims(claim_id),
    FOREIGN KEY (type_id) REFERENCES ExpenseTypes(type_id)
);

CREATE TABLE ApprovalProcesses (
    process_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '审批流程ID',
    claim_id INT NOT NULL COMMENT '报销申请ID',
    approver_id INT NOT NULL COMMENT '审批人ID',
    status ENUM('待审批', '已审批', '已驳回') NOT NULL DEFAULT '待审批' COMMENT '审批状态',
    FOREIGN KEY (claim_id) REFERENCES ExpenseClaims(claim_id),
    FOREIGN KEY (approver_id) REFERENCES Users(user_id)
);

CREATE TABLE ApprovalRecords (
    record_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '审批记录ID',
    process_id INT NOT NULL COMMENT '审批流程ID',
    approver_id INT NOT NULL COMMENT '审批人ID',
    approval_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审批日期',
    approval_result ENUM('同意', '驳回') NOT NULL COMMENT '审批结果',
    remarks TEXT COMMENT '备注',
    FOREIGN KEY (process_id) REFERENCES ApprovalProcesses(process_id),
    FOREIGN KEY (approver_id) REFERENCES Users(user_id)
);

插入数据DML(注意插入数据顺序)

插入数据的时候也要注意主外键关系,如果没有外检的情况下是没有办法插入从表数据的。

代码语言:javascript
复制
INSERT INTO Users (name, gender, department) VALUES
('孙悟空', '男', '天庭技术部'),
('白骨精', '女', '妖界人事部'),
('猪八戒', '男', '天庭财务部');
INSERT INTO ExpenseTypes (type_name) VALUES ('交通费');
INSERT INTO ExpenseTypes (type_name) VALUES ('餐饮费');
INSERT INTO ExpenseTypes (type_name) VALUES ('住宿费');
INSERT INTO ExpenseClaims (user_id, expense_date, total_amount, claim_description, status) VALUES
(1, '2023-04-01', 1500.00, '出差北京期间的费用', '待审批'),
(2, '2023-04-05', 1200.00, '参加会议相关费用', '待审批'),
(3, '2023-04-10', 1800.00, '前往上海培训费用', '待审批');
INSERT INTO ExpenseDetails (claim_id, type_id, amount, expense_description) VALUES
(1, 1, 800.00, '北京至上海的火车票'),
(1, 2, 500.00, '出差期间的餐饮费'),
(1, 3, 200.00, '住宿一晚的费用'),
(2, 1, 400.00, '参加会议的交通费'),
(2, 2, 800.00, '会议期间的餐饮费'),
(3, 2, 1000.00, '培训期间的餐饮费'),
(3, 3, 800.00, '培训期间的住宿费');

-- 插入ApprovalProcesses数据,为每个报销申请创建一个审批流程
INSERT INTO ApprovalProcesses (claim_id, approver_id) VALUES
(1, 1),
(2, 1),
(3, 1);


-- 插入ApprovalRecords数据,为每个审批流程添加审批记录

-- 假设第一个报销申请被同意,第二个被驳回,第三个待审批
INSERT INTO ApprovalRecords (process_id, approver_id, approval_result, remarks) VALUES
(1, 1, '同意', '报销申请已通过'),
(2, 1, '驳回', '部分费用不符合报销规定'),
(3, 1, '同意', NULL);

遵循的数据库三范式

数据库建表的三范式(3NF,Third Normal Form)是关系型数据库设计的基本原则,用于确保数据库结构的逻辑性和减少数据冗余。这三个范式是逐步细化的,每一个范式都是在前一个范式的基础上建立的。下面我将详细解释这三个范式:

第一范式(1NF, First Normal Form)

定义

  1. 列不可分割,即数据库表的每一列都是不可分割的原子数据项。
  2. 每一列都是不可再分的最小数据单元(也称为最小的原子单元)。

解释

  • 在第一范式中,主要关注的是列的原子性。也就是说,表中的每一列都应该只包含一个值,而不能包含集合、数组或其他复合数据类型。
  • 例如,如果有一个“地址”列,它包含了街道、城市、省份和国家等信息,那么这就违反了第一范式。应该将这个“地址”列拆分成多个独立的列,如“街道”、“城市”、“省份”和“国家”。

第二范式(2NF, Second Normal Form)

定义

  1. 满足1NF。
  2. 非主键列必须完全依赖于主键,而不能只依赖于主键的一部分(针对复合主键而言)。

解释

  • 第二范式建立在第一范式的基础上,主要关注于主键与非主键列之间的依赖关系。
  • 在第二范式中,一个表只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
  • 如果表中的某一列只与复合主键的一部分有关,那么它就不应该存在于这个表中,而应该被分离出去形成另外一张新表。

第三范式(3NF, Third Normal Form)

定义

  1. 满足2NF。
  2. 非主键列必须直接依赖于主键,不能存在传递依赖。即非主键列必须直接依赖于整个主键,而不能依赖于主键的一部分。

解释

  • 第三范式是在第二范式的基础上进一步细化的。它主要关注于消除传递依赖,即非主键列不应该依赖于主键的某一部分,而应该直接依赖于整个主键。
  • 如果存在传递依赖,那么应该考虑将这个非主键列分离出去,形成新的表,并通过主键或外键与原表进行关联。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MySQL数据库基础练习系列目标
  • 数据库环境
  • 项目名称与项目简介
  • 数据库DDL(注意创建顺序)
  • 插入数据DML(注意插入数据顺序)
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档