资源描述
客户订购登记系统课程设计
33
2020年5月29日
文档仅供参考
<网络数据库技术>
课 程 设 计
题 目 客户订购登记系统
班 级 网络0904
学 号
姓 名 袁建龙
指导老师 彭维平
12 月 22 日
目 录
一、概述 3
1.1 课程设计的目的 3
1.2 课程设计的内容 3
1.3 课程设计的要求 4
二、需求分析 5
2.1 系统需求 5
2.2 数据字典 7
三、系统总体设计 9
3.1系统总体设计思路 9
3.2 概念模型设计 10
3.2.1 局部E-R图 10
3.2.2 全局E-R图 14
3.3 逻辑结构设计 14
3.4 数据库建立实施 19
3.4.1 建立数据库 19
3.4.2 建立关系表 19
四、系统实现 25
五、系统评价 27
六、课程设计心得、总结 28
参考文献: 29
一.概述
1.1课程设计的目的
经过课程设计,使学生具备将数据库系统与现实世界密切、协调一致结合起来的能力,掌握数据库设计中的需求分析、概念设计、逻辑设计、物理设计的方法,并能够用具体的数据库和编程语言来解决实际的问题。另外还要求学生具备实验结果分析、总结及撰写技术报告的能力。
1.2课程设计的内容
客户订购登记系统
现有一个公司希望为其客户订购行为建立一个数据库。
如果一个客户能够有一份或多份订单,每份订单能够订购一种或多种商品。每份订单有一个发票,能够经过多种方式来支付,例如支票,信用卡或者现金。处理这个客户订购登记的职工的名字要被记录下来。
部门工作人员负责整理订单并根据库存情况处理订单。如果订单上的产品在库存中有,就能够直接发货,发货方式也有多种;如果订单上的产品在库存中没有,就不需要登记或者订购其它产品。
1.3课程设计的要求
1、根据题目查找资料及调研,写出数据库系统的需求分析报告;
2、根据需求分析,设计系统的功能结构,画出系统的功能结构图,设计的功能要全面、正确,能解决现实世界各类用户的实际需要;
3、根据需求分析,确定所设计的系统涉及到的实体、各实体的属性以及各实体之间的联系,用E-R图完成系统的概念模型设计,设计的概念模型要能全面、真实的反应现实世界,能满足系统功能的需要;
4、根据E-R图转换为DBMS支持的关系模型;
5、根据逻辑模型、系统环境和用户需求,设计数据库的物理结构。
6、采用B/S模式,使用Java、ASP、JSP、PHP或ASP.NET程序设计语言之一进行相应前台主要模块和菜单的设计,选择Mysql、Oracle或者SQL Server数据库作为后台服务器。
7、设计一组数据库表的测试实例,对各项功能进行简单的测试并写出测试结果。
二.需求分析
2.1系统需求
客户订购登记数据流图
客户实体的描述属性有:
客户编号,客户名,邮编,电话号,传真号,银行帐号。
产品实体的描述属性有:
产品编号,产品名,型号,规格,单价,重量。
订单实体的描述属性有:
订单编号,客户编号,订货日期,交货日期,发货方式编号,职工编号,执行状态。
订单细节实体的描述属性有:
订单编号,产品编号,订货数量。
发票实体的描述属性有:
发票编号,开票日期,付款日期,订单编号,客户编号,付款方式编号。
发货实体的描述属性有:
发货编号,订单编号,产品编号,数量,发货日期,发货方式编号,完成状态,职工编号。
职工实体的描述属性有:
职工编号,姓名,性别,出生年月,地址,办公电话,住宅电话,EMAIL,职务,职称。
付款方式实体的描述属性有:
付款方式编号,付款方式。
发货方式实体的描述属性有:
发货方式编号,发货方式。
2.2数据字典
(一)客户表
(二)产品表
(三)订单表
(四)订单细节表
(五)发票表
(六)发货表
(七)职工信息表
(八)付款方式表
(九)发货方式表 三.系统总体设计
3.1.系统总体设计思路
3.2概念模型设计
3.2.1局部E-R图
客户实体和订单实体经过提交订单发生联系。每个客户能够提交多份订单,而每份订单只对应一个客户。因此,客户实体和订单实体之间是一对多联系,如图所示。
产品实体和订单细节实体经过订购产品发生联系。每个订单细节能够订购一种产品,而每种产品能够被不同的订单订购。因此,产品实体和订单细节实体之间是一对多联系,如图所示。
订单细节实体是订单实体的组成部分,故必存在联系。一份订单能够订购多种产品,也就是能够有多个订单细节,而每个订单细节只对应一份订单。因此,订单实体和订单细节实体之间是一对多联系,如图所示。
职工实体经过处理订单和订单实体发生联系。每个职工能够处理多份订单,而每份订单只能由一个职工处理。因此,职工实体和订单实体之间是一对多联系,如图所示。
付款方式是发票的组成部分,故必存在联系。每张发票对应一种付款方式,而每种付款方式能够用于不同的发票中。因此,付款方式实体和发票实体之间是一对多联系,如图所示。
发货实体与订单细节实体经过发货打包发生联系。每个订单细节对应多次发货,而每次发货只对应一个订单细节。因此,发货实体和订单细节实体之间是一对多联系,如图所示。
发货方式是发货的组成部分,故必存在联系。每个发货对应一种发货方式,而每种发货方式能够用于不同的发货中。因此,发货方式实体和发货实体之间是一对多联系,如图所示
订单实体和发票实体经过开具发票发生联系。每份订单开具一张发票,而每张发票也只对应一份订单。因此,订单实体和发票实体之间是一对一联系,如图所示。
3.2.2全局E-R图
3.3 逻辑结构设计
客户(客户编号,客户名,邮编,电话号,传真号,银行帐号)
主键:客户编号。
候补键:电话号,传真号,银行帐号。
函数依赖集F:
客户编号®{客户名,邮编,电话号,传真号,银行帐号},
电话号®{客户编号,邮编,传真号,银行帐号},
传真号®{客户编号,客户名,邮编,电话号,银行帐号},
银行帐号®{客户编号,客户名,邮编,电话号,传真号}
虽然,客户编号®电话号,电话号®传真号,但由于电话号®客户编号也成立,因此,客户编号®传真号不是传递函数依赖。
客户关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此客户关系满足第3范式。
产品(产品编号,产品名,型号,规格,单价,重量)
主键:产品编号。
函数依赖集F:
产品编号®{产品名,型号,规格,单价,重量}。
产品关系不存在非主属性与候选键之间的部分与传递函数依赖,因此产品关系满足第3范式。
订单(订单编号,客户编号,订货日期,交货日期,发货方式编号,职工编号,执行状态)
主键:订单编号。
外键:客户编号,引用了客户关系中的客户编号;
发货方式编号,引用了发货方式关系中的发货方式编号;
职工编号,引用了职工关系中的职工编号。
函数依赖集F:
订单编号®{客户编号,订货日期,交货日期,发货方式编号,职工编号,执行状态}。
订单关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此订单关系满足第3范式。
订单细节(订单编号,产品编号,订货数量)
主键:订单编号+产品编号。
函数依赖集F:
{订单编号,产品编号}®订货数量。
订单细节关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此订单细节关系满足第3范式。
发票(发票编号,开票日期,付款日期,订单编号,
客户编号,付款方式编号)
主键:发票编号。
候选键:订单编号。
外键:订单编号,引用了订单关系中的订单编号;
客户编号,引用了客户关系中的客户编号;
付款方式编号,引用了付款方式关系中的付款方式编号。
函数依赖集F:
发票编号®{开票日期,付款日期,订单编号,客户编号,付款方式编号},
订单编号®{发票编号,开票日期,付款日期,客户编号,付款方式编号}。
发票关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此发票关系满足第3范式。
发货(发货编号,数量,发货日期,订单编号,
产品编号,发货方式编号,完成状态,职工编号)
主键:发货编号。
外键:订单编号,引用了订单关系中的订单编号;
产品编号,引用了产品关系中的产品编号;
发货方式编号,引用了发货方式关系中的发货方式编号。
函数依赖集F:
发货编号®{数量,发货日期,订单编号,产品编号,发货方式编号,完成状态,职工编号}。
发货关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此发货关系满足第3范式。
职工(职工编号,姓名,性别,出生年月,地址,办公电话,住宅电话,EMAIL,职务,职称)
主键:职工编号。
候选键:EMAIL。
函数依赖集F:
职工编号®{姓名,性别,出生年月,地址,办公电话,住宅电话,EMAIL,职务,职称},
EMAIL®{职工编号,姓名,性别,出生年月,地址,办公电话,住宅电话,职务,职称}。
职工关系中不存在非主属性与候选键之间的部分与传递函数依赖,因此职工关系满足第3范式。
付款方式(付款方式编号,付款方式)
主键:付款方式编号。
函数依赖集F:
付款方式编号®付款方式。
付款方式关系满足第3范式。
发货方式(发货方式编号,发货方式)
主键:发货方式编号。
函数依赖集F:
发货方式编号®发货方式。
发货方式关系满足第3范式。
所有关系都满足较高的范式要求,故客户订购登记管理的数据库设计是合理的。
3.4 数据库建立实施
3.4.1 建立数据库
CREATE DATABASE `customer_db`;
USE `customer_db`;
3.4.2 建立关系表
建立账单表:
CREATE TABLE `t_bill` (
`bill_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '发票编号',
`raiseddate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '开票日期',
`paydate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '付款日期',
`o_id` int(11) NOT NULL COMMENT '订单编号',
`c_id` int(11) NOT NULL COMMENT '客户编号',
`pay_id` int(11) NOT NULL COMMENT '付款方式编号',
PRIMARY KEY (`bill_id`),
KEY `fk_bill_order` (`o_id`),
KEY `fk_bill_customer` (`c_id`),
KEY `fk_bill_pay` (`pay_id`),
CONSTRAINT `fk_bill_customer` FOREIGN KEY (`c_id`) REFERENCES `t_customer` (`id`),
CONSTRAINT `fk_bill_order` FOREIGN KEY (`o_id`) REFERENCES `t_order` (`id`),
CONSTRAINT `fk_bill_pay` FOREIGN KEY (`pay_id`) REFERENCES `t_pay` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立客户表:
CREATE TABLE `t_customer` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '客户编号',
`name` varchar(20) NOT NULL COMMENT '姓名',
`zip` varchar(50) NOT NULL COMMENT '邮编',
`tel` varchar(20) NOT NULL COMMENT '电话',
`fax` varchar(20) NOT NULL COMMENT '传真',
`bankno` varchar(20) NOT NULL COMMENT '银行帐号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立职工表:
CREATE TABLE `t_employee` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '职工编号',
`name` varchar(20) NOT NULL COMMENT '姓名',
`sex` varchar(20) NOT NULL COMMENT '性别',
`dob` date NOT NULL COMMENT '出生日期',
`address` varchar(50) NOT NULL COMMENT '地址',
`worktel` varchar(20) NOT NULL COMMENT '办公电话',
`hometel` varchar(20) NOT NULL COMMENT '住宅电话',
`email` varchar(20) NOT NULL COMMENT '邮箱',
`position` varchar(20) NOT NULL COMMENT '职位',
`title` varchar(20) NOT NULL COMMENT '职称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立订单表:
CREATE TABLE `t_order` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`p_id` int(11) NOT NULL COMMENT '客户编号哦',
`order_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '订货日期',
`jiao_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '交货日期',
`sm_id` int(11) NOT NULL COMMENT '发货方式编号',
`e_id` int(11) NOT NULL COMMENT '职工编号',
`state` varchar(50) NOT NULL COMMENT '执行状态',
PRIMARY KEY (`id`),
KEY `fk_order_customer` (`p_id`),
KEY `fk_order_shipmentmethod` (`sm_id`),
KEY `fk_order_employee` (`e_id`),
CONSTRAINT `fk_order_customer` FOREIGN KEY (`p_id`) REFERENCES `t_product` (`id`),
CONSTRAINT `fk_order_employee` FOREIGN KEY (`e_id`) REFERENCES `t_employee` (`id`),
CONSTRAINT `fk_order_shipmentmethod` FOREIGN KEY (`sm_id`) REFERENCES `t_shipmentmethod` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立订单细节表:
CREATE TABLE `t_order_details` (
`o_id` int(11) NOT NULL COMMENT '订单号',
`p_id` int(11) NOT NULL COMMENT '产品号',
`numer` int(11) NOT NULL COMMENT '订货数量',
PRIMARY KEY (`o_id`,`p_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立付款表:
REATE TABLE `t_pay` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '付款方式编号',
`method` varchar(20) NOT NULL COMMENT '付款方式',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立产品表:
CREATE TABLE `t_product` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '产品编号',
`name` varchar(20) NOT NULL COMMENT '产品名',
`moder` varchar(20) NOT NULL COMMENT '型号',
`norm` varchar(20) NOT NULL COMMENT '规格',
`price` float NOT NULL COMMENT '单价',
`weight` float NOT NULL COMMENT '重量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立发货表:
CREATE TABLE `t_shipment` (
`shipment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '发货编号',
`o_id` int(11) NOT NULL COMMENT '订单号',
`p_id` int(11) NOT NULL COMMENT '产品号',
`number` int(11) NOT NULL COMMENT '数量',
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '发货日期',
`sm_id` int(11) NOT NULL COMMENT '发货方式编号',
`state` varchar(20) NOT NULL COMMENT '完成状态',
`e_id` int(11) NOT NULL COMMENT '职工编号',
PRIMARY KEY (`shipment_id`),
KEY `fk_shipment_order` (`o_id`),
KEY `fk_shipment_product` (`p_id`),
KEY `fk_shipment_shipmentmethod` (`sm_id`),
KEY `fk_shipment_employee` (`e_id`),
CONSTRAINT `fk_shipment_employee` FOREIGN KEY (`e_id`) REFERENCES `t_employee` (`id`),
CONSTRAINT `fk_shipment_order` FOREIGN KEY (`o_id`) REFERENCES `t_order` (`id`),
CONSTRAINT `fk_shipment_product` FOREIGN KEY (`p_id`) REFERENCES `t_product` (`id`),
CONSTRAINT `fk_shipment_shipmentmethod` FOREIGN KEY (`sm_id`) REFERENCES `t_shipmentmethod` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建立发货方式表:
CREATE TABLE `t_shipmentmethod` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '发货方式编号',
`method` varchar(20) NOT NULL COMMENT '发货方式',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
四 系统实现
1. 数据库实现:在使用mysql创立好数据库后,对数据库进行连接,在设置好数据源与JDBC的连接,就能使用数据库了。在此程序中,数据源设置为customer_db。
数据库的连接:
Class.forName(com.mysql.jdbc.Driver);
Connection conn = DriverManager.getConnection(jdbc:mysql:///customer_db);
2. 登陆界面:
登陆时的验证:
String name = request.getParameter("admin");
String pwd = request.getParameter("pwd")
AdminDao dao = new AdminDao();
Admin admin = dao.findByNameAndPassword(name, pwd);
if(admin!=null){
if(admin.getName().equals(name)&&admin.getPassword().equals(pwd)){
request.setAttribute("admin", admin);
request.getRequestDispatcher("show.jsp").forward(request, response);
}
}else{
response.sendRedirect("index.jsp");
}
3. 主界面:
五 系统评价
此次设计的网站完成了本次课程设计的任务要求,实现了客户、订单等相关信息的管理,并实现了各种信息的查询,能够正确的提示各类错误,例如修改密码时两次密码输入不正确,创立新客户时没有输入姓名等。登录界面的设置为数据的安全提供了一定的保障。网站的使用比较简单,能使使用者方便的使用。软件的不足之处也很多,例如数据操作还不是很完善,窗口界面太过单调,界面不够美观,有些功能还没有实现等等。
六 课程设计心得、总结
经过设计客户订购登记系统,从需求分析开始,逐步的进行概念设计、逻辑设计、物理设计以及实现等,掌握了数据库系统设计的整个流程。在设计过程中,首先将系统中的实体找出来,然后再建立系统的E-R图,这是概念结构设计的内容。在逻辑设计中,将E-R图转换成关系模式,这里涉及到对联系的处理。我们能够按照习惯将联系作为一个单独的关系模式,也能够将联系与n端对应的关系模式合并。该设计中,就采用了这两种不同的方式。物理设计主要是完成数据库在实际物理设备上的存储结构和存取方法的选取。我选用了聚簇方法应用到订单和商品关系,这样,进行商品查询或订单查询时,就比较方便、也省去了对结果的再排序等麻烦。而对系统中其它关系的存取方法的选取还有待研究。由于对物理设计掌握的不够好,这里设计的也并不全面。最后的实现中,用jsp和SQL 实现了用户注册这个模块。经过与数据库连接,能够在程序中对数据库中的表直接操作。从而实现了将用户的注册信息插入数据库。
当然,由于是第一次进行数据库的设计,这次课程设计中也存在一些不足,。这些都是需要改进的地方。
总的来说,经过对系统的设计,我对数据库设计的处理过程、对数据的分析、对SQL语言的运用等都有了进一步的掌握和提高。
参考文献:
1.<HeadFist Java>中国电力出版社
2.<HeadFirst Servlet & JSP>中国电力出版社
3. <JavaScript高级程序设计(第2版)>.(美)泽卡斯.
4.<精通CSS 高级web标准解决方案(第二版)
5.<HeadFirst Html>中国电力出版社
课程设计评价
课
程
设
计
教
师
评
语
及
成
绩
指导教师: 彭维平
日期: 月 日
展开阅读全文