目录

一、背景

二、口罩预约管理系统介绍

三、数据库设计

四、MySQL创建数据库以及数据表

五、数据库设计总结

一、背景

  2020年的疫情影响了我们的生产生活,政府不断加大力度联防联控,遏制疫情的蔓延势头,全国人民共同加入抗击疫情的战“疫”队伍。疫情信息发布、物资调配保障显得尤其重要,信息越详细,物资保障越充分,公众的疑虑就越少。“疫情地图”、“实时信息”、“口罩预约”的各种 APP、小程序和系统应运而生,不断规范化,纳入疫情发布的官方渠道。这些举措让公众能全方位获取疫情防控进展的信息,及时、准确、全面显得至关重要。

  另外,这个小项目也是过去许久,疫情期间也有在市政官方系统预约口罩的经历,(・。・)没有中签过。不过因此对它的预约系统感兴趣,考虑自己可以简单做一个web网站版本的预约管理系统,实现基本功能,也正好课程需要完成一个数据库设计,然后做一个相对完整的应用系统,所以,这个小项目就此开始。

二、口罩预约管理系统介绍

1、功能模块及特点

本系统主要任务是实现用户口罩预约、市政人员(管理员)分配以及快递员接单配送的比较完整的功能。市政人员(管理员),普通用户,快递员这三种用户权限,功能明确,各自独立,而又存在着一定的联系,让政府更方便地管理、更高效地分配。

具体模块解析如下:

  1. 普通用户模块:创建账号,登录系统填写预约信息确认提交,查看订单状态,修改订单预约信息,修改个人注册信息。
  2. 市政人员(管理员)模块:查询已注册用户信息,修改或删除用户信息,对用户的预约订单进行合理分配,包括审核以及分配快递员。管理每种类型口罩,查询库存数量,合理分配用户预约的口罩数量,按需求查看订单的配送状态。
  3. 快递员模块:查看分配到的订单,选择接单配送,完成配送选择关单,按订单状态查看订单,统计完成的订单数量。

2、系统结构

系统功能结构图:

三、数据库设计

在口罩预约管理系统初期阶段,我们需要设计好系统存取数据信息的一个数据库,数据库设计也是一个重点难点,完整的数据库基本满足设计基本要求,包括数据库关系模式分析,处理好函数依赖问题,还有关系模式至少满足第三范式等。学过数据库系统概论会基本了解这些知识以及它的重要性和难度。

以目前个人能力,这个系统数据库的建立暂时满足最基本的要求,初步进行了函数依赖分析,另外根据所需功能,关系模式不是很复杂,第三范式的满足只存在于部分关系模式中。

我使用的是MySQL数据库,前期建立数据字典,然后以此进一步建立数据库及数据表,确定口罩预约管理数据库关系模式,分析关系模式的函数依赖和范式要求。接下来将具体介绍数据字典、数据模型和概念模型(E-R 图)

1、数据字典

根据系统功能需求,系统数据库包含了8个数据表,详细内容(字段、数据类型、码)如下数据字典:

1、admin表

属性名

数据描述

数据类型

是否为空

备注

work_id

管理员账号

varchar(32)

不允许

主码

ad_name

管理员名

varchar(32)

不允许

pwd

密码

varchar(32)

不允许

phone

电话

varchar(32)

2、users表

属性名

数据描述

数据类型

是否为空

备注

user_id

用户账号

varchar(32)

不允许

主码

user_name

姓名

varchar(32)

不允许

ID

身份证号

varchar(32)

不允许

pwd

密码

varchar(32)

不允许

register_date

注册时间

datetime

3、deliver表

属性名

数据描述

数据类型

是否为空

备注

deliver_id

账号

varchar(32)

不允许

主码

deliver_name

姓名

varchar(32)

不允许

phone

联系方式

varchar(32)

pwd

密码

varchar(32)

不允许

4、mask表

属性名

数据描述

数据类型

是否为空

备注

mask_type

类型号

varchar(32)

不允许

主码

m_name

名称

varchar(32)

不允许

remain_num

库存量

int(11)

不允许

price

价格

int(11)

5、info表

属性名

数据描述

数据类型

是否为空

备注

order_id

订单号

varchar(32)

不允许

主码

user_id

用户账号

varchar(32)

不允许

外码,参照users

user_name

用户姓名

varchar(32)

不允许

allocate_num

分配数量

int(11)

不允许

phone

联系方式

varchar(32)

不允许

address

配送地址

varchar(32)

不允许

status

订单状态

varchar(32)

不允许

re_date

下单日期

datetime

6、reserve表

属性名

数据描述

数据类型

是否为空

备注

user_id

预约账号

varchar(32)

不允许

主码,参照users

re_date

下单日期

datetime

不允许

主码

mask_type

类型

varchar(32)

不允许

外码,参照mask

ID

身份证号

varchar(32)

不允许

r_num

预约数量

int(11)

不允许

ex_date

期望到货日

date

phone

联系方式

varchar(32)

address

地址

varchar(32)

7、allocate表

属性名

数据描述

数据类型

是否为空

备注

work_id

分配人

varchar(32)

不允许

主码,参照admin

order_id

订单号

varchar(32)

不允许

主码,参照order

allocate_time

分配日期

datetime

deliver_id

快递员

varchar(32)

不允许

主码,参照deliver

8、take表

属性名

数据描述

数据类型

是否为空

备注

deliver_id

快递员账号

varchar(32)

不允许

主码,参照deliver

order_id

订单号

varchar(32)

不允许

主码,参照order

take_date

接单日期

datetime

finish_date

关单日期

datetime

2、口罩预约数据库关系模式(数据模型)

各个数据表包含属性,红色表示该关系模式的主码。

管理员 (管理员账号, 密码, 管理员姓名, 电话)

用户   (用户账号, 密码, 用户姓名, 身份证号)

快递员 (快递员账号, 密码, 快递员姓名, 电话, 地址)

口罩   (口罩类型, 仓库, 存货量, 单位价格)

订单信息 (订单号, 用户账号, 用户姓名,口罩类型, 已分配数量, 联系方式, 配 送地址, 订单状态, 预约时间)

预约 (用户帐号, 口罩类型, 预约时间, 期望到货日期, 预约数量, 电话, 地址)

分配 (管理员账号, 订单号, 快递员账号, 分配日期)

接关单 (快递员账号, 订单号, 快递员姓名, 接单时间, 关单时间)

3、E-R图(概念模型)

E-R图能够更加直观的展示数据关系模式之间的联系,下面则是自己画的:

这个是建立数据库后系统生成的:

四、MySQL创建数据库以及数据表

这个步骤开始对设计好的关系模式在MySQL上部署数据库以及建立各个数据表。建表代码如下:

  • 建立数据库
create database maskorder;
  • admin数据表(管理员表)
create table admin(work_id varchar(32) primary key not null,

                    pwd varchar(32) not null,

                    ad_name varchar(32),

                    phone varchar(32));
  • users数据表(用户表)
create table admin(work_id varchar(32) primary key not null,
pwd varchar(32) not null,
ad_name varchar(32),
phone varchar(32));
  • delivers数据表(快递员表)
create table delivers(deliver_id varchar(32) primary key not null,

                    pwd varchar(32) not null,

                    deliver_name varchar(32) not null,

                    phone varchar(32));
  • reserve数据表(用户预约表)
create table reserve(user_id varchar(32) not null,

                    re_date datetime not null,

                    foreign key (user_id) references users(user_id),

                    primary key(user_id,re_date),

                    ID varchar(32) not null,

                    r_num int not null,

                    ex_date date not null,

                    phone varchar(32) not null,

                    address varchar(32) not null);
  • mask数据表(口罩信息表)
create table mask(mask_type varchar(32) primary key not null,

                    store varchar(32) not null,

                    remain_num int not null,

                    price int not null);
  • info数据表(订单表)
create table info(order_id varchar(32) primary key not null,

                    user_id varchar(32) not null,

                    foreign key (user_id) references users(user_id),

                    user_name varchar(32) not null,

                    allocate_num int not null,

                    statue varchar(32) not null,

                    re_date datetime not null,

                    phone varchar(32) not null,

                    address varchar(32) not null );
  • allocate数据表(管理员分配表)
create table allocate(work_id varchar(32) not null,

                      order_id varchar(32) not null,

                      deliver_id varchar(32) not null,

                      allocate_time datetime not null,

                      primary key (work_id,order_id),

                      foreign key (work_id) references admin(work_id),

                      foreign key (order_id) references info(order_id) );
  • take数据表(快递员接关单表)
create table take(deliver_id varchar(32) not null,

                    order_id varchar(32) not null,

                   deliver_name varchar(32) not null,

                    take_time datetime not null,

                    finish_time datetime not null,

                    primary key (deliver_id,order_id),

                    foreign key (deliver_id) references delivers(deliver_id),

                    foreign key (order_id) references info(order_id) );
  • deli_order视图(快递员查看订单表)
create view deli_order as

        select order_id,mask_type,allocate_num,phone,addresss,statue,re_date

        from info;

五、数据库设计总结

  在系统开发之前,数据库的设计是首要并且关键的一个步骤,对于此系统的数据表,上面介绍的是最后确定的数据表。数据库设计并不能一蹴而就,这里总结一下我不断修改的想法过程。

  第一次根据系统所需要的数据建立关系模式,在保证函数依赖和无损连接的情况下,将属性phone、address放入reserve表中,users表和reserve的关系模式满足了第三范式的要求。起初设计表时候考虑是否将reserve和info合并,后来发现在物理设计和实际场景下,订单信息表info由用户预约后的reserve表生成,并且加入特有的属性订单状态status、口罩分配数量allocate_num和订单号order_id。

  至此从reserve表脱离出来,后期用户、管理员、快递员对订单的查询的操作,实现了模块化的处理,不仅减少了表的连接,而且物理操作(前后端编程)更加容易,因为数据库设计中也要符合物理上的要求,所以关系模式分解为两个表,虽然增加了部分数据上的冗余,但是保证信息的模块化和实际应用的合理性。

  在口罩预约管理系统数据库设计中遇到了这些问题,后来经过了理论上的分析和实际运用,解决了设计上的问题,认识到了数据模型建立的关键性。目前该数据库还可以进一步完善。

  这一篇主要讲的是口罩预约管理系统定位的功能模块以及数据库设计的具体过程,这也是完成这个系统第一阶段的完整部分,下一篇将介绍系统前后端的搭建以及数据库连接,使用到的知识包括前端(HTML+CSS+Javascript)、后端(PHP)和MySQL数据库的操作,目的是建立简洁、包含基本功能的(口罩预约管理)应用系统。

本篇的口罩预约管理系统数据库maskOrder.txt已上传,可直接导入本地MySQL数据库。

系列文章:

(一)口罩预约管理系统——数据库设计(前端+PHP+MySQL)

(二)口罩预约管理系统——系统网站实现(前端+PHP+MySQL)


我的博客园:https://www.cnblogs.com/chenzhenhong/p/13677690.html

我的CSDN博客:https://blog.csdn.net/Charzous/article/details/108576174

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

随机推荐

  1. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  2. AC中保存数据与查询数据

    //保存数据 hui.ajax(function (ret, err) { }, url, {values: {t:"test",m:"Search",c:&q ...

  3. 1008win7与虚拟机中的linux共享文件的(详细)方法

    转自http://jingyan.baidu.com/article/ca00d56c74dde4e99eebcfd2.html 好东西一起分享 win7与虚拟机中的linux共享文件的(详细)方法 ...

  4. HDU 5968:异或密码(暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=5968 题意:中文题意. 思路:一开始不会做,后来发现数据范围很小,而且那个数要是连续的,所以可能把所有情况枚举出 ...

  5. Ibatis.Net各类的作用说明(三)

    一.SqlMapper类 Ibatis中,加载.分析配置以及映射文件是在创建SqlMapper实例的时候进行的,另外对数据库的操作,也是在SqlMapper实例上调用方法来完成.在IBatis外部的程 ...

  6. Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探   为什么要学习函数式编程?为什么要学习Haskell?   .net到前端,C#和JavaScript对我来说如果谈不上精通,最起码也算是到了非常熟悉的 ...

  7. 蓝书例题之UVa 10253 Series-Parallel Networks

    挺有趣的一道题 首先转化模型,思路参考蓝书,可得出等同于求共n个叶子,且每个非叶结点至少有两个子结点的无标号树的个数的二倍,设个数为\(f[n]\) 考虑怎么求\(f[n]\),假设有一个\(n\)的 ...

  8. MySQL SQL语句执行顺序

    MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来 ...

  9. 【linux】netstat 详解

    Linux netstat命令用于显示网络状态. 利用netstat指令可让你得知整个Linux系统的网络情况. 在Internet RFC标准中,Netstat的定义是: Netstat是在内核中访 ...

  10. javascript之系统对话框

    浏览器通过alert(),confirm()和prompt()方法调用系统对话框,向用户显示信息. alert()接受一个字符串并显示给用户,结果是显示一个对话框,其中包括指定的文本和一个OK(“确定 ...