. ... .1.引言1.1 编写目的本文档是销售订单数据库管理系统设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,用来指导后期的数据库脚本的开发,本文档遵循《SQL SERVER 2008数据库设计和开发规》。
本文档的读者对象是需求人员、系统设计人员、开发人员、测试人员。
设计该数据库的目的是为了能够模拟完成一次订单销售流程。
1.2 参考资料表1.2.12.需求规约2.1 业务描述销售订单数据库管理系统的总目标是:在计算机网络,数据库和先进的开发平台上,利用现有的软件,配置一定的硬件,开发一个具有开放体系结构的、易扩充的、易维护的、具有良好人机交互界面的销售订单数据库管理系统,实现订单销售的自动化的计算机系统,为商品供应商提供准确、精细、迅速的订单销售信息。
具体功能为供应商供应产品、请假的申请,出差的记录输入到系统中,系统将为员工记录这些信息。
提示:本部分完成此数据库系统的业务描述,例如:(1)数据库系统创建的背景(2)数据库系统要完成的业务流程及工作容(3)揭示该数据库的资源需求和设计约束2.2 需求分析1、数据要求及数据关系(1)数据结构:此销售订单数据库管理系统包括供应商、产品、客户、雇员4个实体。
每个供应商包含供应商编号、名称、地址、联系等信息;每种产品包含产品号、产品名称、产品类别等信息;客户包含编号、姓名、通信地址、等信息;雇员包括编号、姓名、联系等信息。
(2)数据关系:供应商与产品有供应关系,包含销量和库存量;供应商与雇员有雇用关系;雇员,客户,产品有订单关系,包含订单号,日期,订购量,总额;客户所下达的订单号的需求量如果多于库存量,那么订单将不生成。
(3)对应关系:每个供应商可供应多种产品,每种产品可由多个供应商供应;一个客户可下多个订单,每个订单只能由一个客户下;一个雇员可管理多个订单,每个订单只能由一个雇员管理;一个订单订购多种产品每种产品可在不同的订单中订购;一个供应商能雇用多个雇员,一个雇员只能被一个供应商雇用。
2、增删改查操作:(1)增加操作:此销售订单数据库管理系统能够插入供应商数据,能够插入产品数据,能够插入客户信息,能够插入雇员信息,能够进行下订单操作插入订单信息。
(2)删除操作:此销售订单数据库管理系统能够删除供应商数据,能够删除产品数据,能够删除客户信息,能够删除雇员信息,能够进行退订操作删除订单信息。
(3)更新操作:此销售订单数据库管理系统能够改变供应商数据,改变产品数据,改变客户信息,改变雇员信息。
(4)查询操作:通过供应商编号能查询到供应商编号、名称、地址、联系等信息;通过产品号能查询到产品号,产品名称,产品类别,库存数量,售价以;能通过客户编号能查询到客户所有客户编号,姓名,通信地址,;通过雇员号能查询到雇员雇员编号,雇员姓名,雇员,雇员工资;此外,通过供应商编号还能查询到所有雇员信息,通过雇员号可以查询到该雇员的供应商所有信息;再通过供应商编号及产品号能过查询到供应商的产品的产品量,接着通过产品号分组号能够查询所有产品的总销量,最畅销产品,通过供应商编号分组能够查询该供应商的所有产品的销量,最受欢迎供应商;通过产品号跟订单号能够查询到订购量,及总额,再通过产品号分组能够可以查询到所有产品的总订购量;通过雇员号能偶查询到所负责的订单信息,通过客户号能查询到所下达订单及所有信息,通过订单号能够查询到所有订单的订购的所有产品及信息,所负责雇员及所有信息,所下达客户及所有信息。
3、编写要求:(1)此销售订单数据库管理系统全部使用sql语句编写;(2)增删改查及下订单退订等操作通过存储过程来实现,定义级联删除约束,下订单及退订使用到触发器,实现并发操作。
(3)给不同用户定义不同的视图,使他们看到是不同的容。
3.数据库环境说明表3.14.数据库的命名规则4.1 数据库对象命名规则表4.1.14.2 数据项编码规则表4.2.15.逻辑设计5.1 ER图图5.1.15.2 关系模式供应商(供应商编号,名称,地址,联系)产品(产品号,产品名称,产品类别,售价)供应(供应商编号,产品号,供应量,存货数量)雇员(雇员号,姓名,联系,工资,供应商编号)客户(客户编号,姓名,通信地址,)订单(订单号,客户编号,雇员编号,日期)订单细则表(产品号,数量,总额,订单号,供应商号)注:有下划线的表示该属性为主码。
表5.2.1表5.2.25.2.3表Array5.2.4表Array表5.2.5表5.2.6表5.2.76.物理设计6.1 表汇总表6.1.16.2 表[1][supplier表](供应商表)表6.2.16.3 表[2][product表](产品表)表6.3.16.4 表[3][sp表](供应关系表)表6.4.16.5 表[4][epc表](订单表)表6.5.16.6 表[5][epc_detailed表](订单细则表)表6.6.16.7 表[6][eployee表](雇员表)表6.7.16.8 表[7][customer表](客户表)表6.8.16.9 视图的设计1、建立一供应商查询视图目的:供供应商查询功能:能够查询到所有产品销售情况意义:使供应商能够看到最畅销的产品,及时调整销售策略。
Create view supplier_viweasselect product_no,sum(sp_amount)’产品总销售量’from spgroup by product_no图6.9.11、建立一客户查询视图目的:供客户查询功能:能够查询到所有供应商所有产品的总销售量意义:是客户可以看到最畅销的供应商,便于选择合适的供应商。
Create view customer_viweasselect supplier_no,sum(sp_amount)’产品总销售量’from spgroup by supplier_no图6.9.22、建立一雇员查询视图目的:供雇员查询功能:供雇员查询意义:能够看到所有雇员信息及所在供应商create view employee_viweasselect employee_no,employee_name,employee_phone,supplier_name from employee,supplierwhere supplier.supplier_no=employee.supplier_no图6.9.36.10 存储过程、函数及触发器的设计1、插入供应商信息插入供应商信息功能:插入供应商信息目的:存储查询插入供应商信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure pro_insert_supplier@supplier_no varchar(12),@supplier_name varchar(20),@supplier_address varchar(20),@supplier_phone varchar(12)asif(select COUNT(*)from supplier where supplier_no=@supplier_no)>0print’error!!!’elseinsert intosupplier(supplier_no,supplier_name,supplier_address,supplier_phone)values(@supplier_no,@supplier_ name,@supplier_address,@supplier_phone)exec pro_insert_supplier ‘1000’,’沃尔玛’,’美国’,’’;exec pro_insert_supplier ‘1001’,’英国石油’,’英国’,’’;exec pro_insert_supplier ‘1002’,’埃克森美孚’,’美国’,’’;exec pro_insert_supplier ‘1003’,’皇家壳牌石油’,’英国’,’’;exec pro_insert_supplier ‘1004’,’通用汽车’,’德国’,’’;exec pro_insert_supplier ‘1005’,’戴姆勒克莱斯勒’,’美国’,’’;exec pro_insert_supplier ‘1006’,’丰田汽车’,’日本’,’’;exec pro_insert_supplier ‘1007’,’福特汽车’,’美国’,’’;exec pro_insert_supplier ‘1008’,’通用电气’,’德国’,’’;exec pro_insert_supplier ‘1009’,’海尔’,’中国’,’’;exec pro_insert_supplier ‘1009’,’海尔’,’中国’,’’;图6.10.12、删除供应关系信息功能:删除供应关系信息目的:存储删除插入供应关系信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure pro_delete_sp@supplier_no varchar(12)asif(select COUNT(*) from sp where supplier_no=@supplier_no)>0 deletefrom spwhere supplier_no=@supplier_noexec pro_delete_sp’1001’图6.10.2图6.10.33、更新雇员信息功能:更新雇员信息目的:存储更新雇员信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure pro_update_employee@employee_no varchar(12),@employee_name varchar(20),@employee_phone varchar(12),@employee_salary smallint ,@supplier_no varchar(12)asif exists(select * from employee where employee_no=@employee_no)update employeesetemployee_name=@employee_name,employee_phone=@employee_phone,employee_salary=@employee_salary,supplier_no =@supplier_nowhere employee_no=@employee_noelseprint’无此信息!’exec pro_update_employee’1004’,’菜广’,’’,1000,’1001’;图6.10.4图6.10.54、查询订单细则信息功能:查询订单细则信息目的:存储查询订单细则信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure pro_select_epc_detailed@order_no varchar(6)asselect * from epc_detailed;where order_no=@order_noexec pro_select_epc_detailed’1001’;图6.10.65、下订单流程功能:下订单目的:客户根据产品名下订单意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure pro_exec@order_no varchar(6),@customer_no varchar(12),@employee_no varchar(12),@supplier_no varchar(12),@product_name varchar(20),@order_time varchar(20),@order_amount smallint,@order_money smallintasif(select COUNT(*) from epc where order_no=@order_no)>0print’已经存在订单号!’else if(select COUNT(*) from product where product_name=@product_name and product_noin(select product_no from sp where supplier_no=@supplier_no))=0print’该供应商不提供应该产品’else if(select rest_product from sp where supplier_no=@supplier_no and product_no=(select product_no from product where product_name=@product_name))<@order_amountprint’库存量不足!’else begin insert intoepc(order_no,customer_no,employee_no,order_time)values(@order_no,@customer_no,@employee_ no,@order_time)insert intoepc_detailed(order_no,supplier_no,product_no,order_amount,order_money)values(@order_no,@su pplier_no,(select product_no from product whereproduct_name=@product_name),@order_amount,@order_money)print’下订单成功’endexec pro_exec’1000’,’1001’,’1001’,’1001’,’电脑’,’20130601’,1000,10000;--下订单exec pro_delete_epc_detailed’1000’; --退订图6.10.7图6.10.85、触发器功能:并发操作目的:减少库存,增加销售量意义:可并发执行,自动增加销售量,减少库存量--删除触发器create trigger tri_deleteon epc_detailedafter deleteas update spset rest_product=rest_product+(select order_amount from deleted),sp_amount=sp_amount-(select order_amount from deleted)from deleted,spwhere sp.product_no=deleted.product_no and sp.supplier_no=deleted.supplier_no--插入触发器create trigger tri_inserton epc_detailedafter insertas update spset rest_product=rest_product-(select order_amount from inserted),sp_amount=sp_amount+(select order_amount from inserted)from sp,insertedwhere sp.product_no=inserted.product_no and sp.supplier_no=inserted.supplier_no图6.10.9图6.10.10图6.10.117.总结经过了艰难的两个星期,终于把这个订单销售管理系统做好了。