五、逻辑设计5.1 ER 图产品编号产品产品名称供应商编号产品类型名称地址供应商供应产品售价出厂价供应商编号联系电话产品编号订购订单编号客户编号姓名下发订单客户通信地址管理电话雇员编号雇员姓名存货量数量订单编号日期雇员编号客户编号联系电话工资5.2 关系模型供应商 (供应商编号,名称,地址,联系电话)产品 (产品编号,产品名称,产品类别,售价,出厂价,存货量)供应 (供应商编号,产品编号 )订购 (产品编号,订单编号,数量 )客户 (客户编号,姓名,通信地址,电话)订单 (订单编号,日期,客户编号,雇员编号)雇员 (雇员编号,姓名,联系电话,工资)注:有下划线的表示该属性为主码。
六、物理设计6.1 表汇总表名功能说明表 Suppliers 表 Product 表 SP表 Orders表 PO表 Employee 供应商表,存储供应商的编号等信息产品表,存储产品的编号、数量等信息供应商产品供应表,存储供应商所供应的产品对应信息订单表,存储订单的编号、日期等信息产品订购表,存储产品订购的对应信息雇员表,存储雇员的编号等信息表 Customer客户表,存储客户的编号等信息6.2 表 [1]:[ Suppliers表](供应商表)表名Suppliers(供应商表)数据库用户Sa主键Snumber其他排序字段无索引字段无序号字段名称数据类型(精允许为唯一区别度默认值约束条件 / 说明度范围)空 Y/N Y/N1Snumber char(12)N Y高无主键 / 供应商号2Sname char(30)N N中无供应商名称3Saddress char(30)Y N中无供应商地址4Stelnum int Y N高无供应商电话sql 脚本-- 建立供应商表create table Suppliers --供应商表(Snumber char(12) primary key,--供应商编号,主码Sname char(30) not null,--姓名Saddress char(30), --地址Stelnum int --电话);6.3 表 [2]:[ Product表](产品表)表名Product (产品表)数据库用户sa主键Pnumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Pnumber char(12)N Y高无主键 / 产品编号2Pname char(30)N Y高无产品名称3Pcategory char(15)Y N低无产品类别4Pprice int Y N中无产品售价5Pex_price real Y N中无产品出厂价6Pinventory real Y N中无产品库存量sql 脚本-- 建立产品表create table Product --产品表(Pnumber char(12) primary key, --产品编号 , 主码Pname char(30) not null, --产品名称Pcategory char(15), --产品类别 --Pprice int, --售价 --Pex_price real, --出厂价 --Pinventory real --存货量 --);6.4 表 [3]:[ SP表](供应商产品供应表)表名SP(供应商产品供应表)数据库用户sa主键Snumber,Pnumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Snumber char(12)N Y高无主键 / 供应商号2Pnumber char(12)N Y高无主键 / 产品编号sql 脚本-- 建立供应商产品供应表create table SP--供应商供应产品表 --(Snumber char(12),--供应商编号,外码Pnumber char(12),--产品编号,外码primary key(Snumber,Pnumber),--联合主码foreign key (Pnumber) references Product(Pnumber)on delete cascadeon update cascade,foreign key (Snumber) references Suppliers(Snumber)on delete cascadeon update cascade);6.5 表 [4]:[ Orders表](订单表)表名Orders (订单表)数据库用户sa主键Onumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Onumber char(12)N Y高无主键 / 订单号2Odate date N N低无订单日期3Enumber char(12)Y N中无雇员号4Cnumber char(12)N N高无客户号sql 脚本-- 建立订单表create table Orders--订单表(Onumber char(12)primary key,--编号,主码Odate date,--日期Enumber char(12),--设置雇员号 , 外码Cnumber char(12),--设置客户号 , 外码foreign key (Cnumber) references Customer(Cnumber)on delete cascadeon update cascade,foreign key (Enumber) references Employee(Enumber)on delete cascadeon update cascade);6.6 表 [5]:[ PO表](产品订购表)表名PO(产品订购表)数据库用户sa主键Pnumber,Onumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Pnumber char(12)N Y高无2Onumber char(12)N Y高无3Quantity int N N低无sql 脚本-- 建立产品订购表create table PO--产品订购表(Pnumber char(12),--产品编号Onumber char(12),--订单编号Quantity int,--产品数量primary key(Pnumber,Onumber),--联合主码foreign key (Pnumber) references Product(Pnumber)-- on delete cascadeon update cascade,foreign key (Onumber) references Orders(Onumber)--on delete cascadeon update cascade);主键 / 产品号主键 / 订单号订购产品数量外码外码6.7 表 [6]:[ Employee表](雇员表)表名Employee(雇员表)数据库用户sa主键Enumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Enumber char(12)N Y高无主键 / 雇员号2Ename char(10)N N中无雇员名称3Etelnum int N Y高无雇员电话4Ewages real N N低无雇员薪资sql 脚本-- 建立雇员表create table Employee--雇员表(Enumber char(12) primary key,--编号Etelnum int,--电话Ewages real--工资);6.8 表 [7]:[ Customer表](客户表)表名Customer (客户表)数据库用户sa主键Cnumber其他排序字段无索引字段无序号字段名称数据类型(精度允许唯一区别度默认值约束条件 / 说明范围)为空Y/NY/N1Cnumber char(12)N Y高无主键 / 客户表2Cname char(10)N N中无客户名称3Caddress char(30)Y N中无客户地址4Ctelnum int Y Y高无客户电话sql 脚本-- 建立客户表create table Customer--客户表(Cnumber char(12) primary key,--编号Cname char(10),-- 姓名Caddress char(30),--地址Ctelnum int--电话);6.9视图的设计1、建立一张雇员信息的视图目的:屏蔽雇员的工资信息。
功能:能够向管理员提供简明,直接的雇员信息展示。
意义:有利于数据库安全的维护,防止任意修改数据库中的雇员信息。
create view view_Employee--建立Employee视图,屏蔽工资属性asselect Enumber,Ename,Etelnumfrom Employeewith check option;2、建立一张产品信息的视图目的:屏蔽产品的出厂价信息。
功能:能够向管理员提供简明,直接的产品信息展示。
意义:有利于数据库安全的维护,防止任意修改数据库中的产品信息。
create view view_Producte--建立Product视图,屏蔽出厂价属性asselect Pnumber,Pname,Pcategory,Pprice,Pinventoryfrom view_Productewith check option;6.10存储过程的设计1、查询订单数量功能:查询订单的数量目的:存储查询订单数量的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchOrdersNum --查询订单的存储过程As select COUNT(*) '订单总数'--查询订单数量from Orders;2、查询客户的订单信息功能:查询客户的订单信息目的:存储查询客户的订单信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_CustomerOrders--查询某个客户订单信息@Cname char(10) as select Onumber,Odate,Enumberfrom Orders,Customerwhere Cname like @Cname and umber like umber;3、查询订单最多的客户信息功能:查询订单最多的客户信息目的:存储查询订单最多的客户信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchMaxOrders--查询订单最多的客户信息asselect Cnumber,Cname,Caddress,Ctelnumfrom Orders,Customerwhere unmer=unmergroup by Cnumber having MAX(Cnumber);4、查询客户信息功能:查询客户信息目的:存储查询客户信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchCustomer--查询某客户信息@Cname char(10)asselect *from Customerwhere Cname=@Cname;5、查询雇员信息功能:查询雇员信息目的:存储查询雇员信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchEmployee--查询某雇员信息@Ename char(10)asselect *from Employeewhere Ename=@Ename;6、查询某订单对应的产品信息功能:查询某订单对应的产品信息目的:存储查询某订单对应的产品信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchPO--查询某订单的产品信息@Onumber char(12)asselect Onumber,Product.Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventoryfrom Product,POwhere Onumber=@Onumber and PO.Pnumber=Product.Pnumber;7、查询产品信息功能:查询产品信息目的:存储查询产品信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_SearchProduct--查询某产品信息@Pnumber char(12)asselect Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory,Snumberfrom Product,SPwhere Pnumber=@Pnumber and SP.Pnumber=@Pnumber;8、插入供应商信息功能:插入供应商信息目的:存储插入供应商信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedureprocedure_InsertSuppliers-- 插入供应商信息@Snumber char(12),@Sname char(30),@Saddress char(30),@Stelnumint asIF EXISTS(SELECT * FROM Suppliers WHERE Snumber=@Snumber)print' 该供应商记录已经存在'ELSEinsert into Suppliers(Snumber,Sname,Saddress,Stelnum)values(@Snumber,@Sname,@Saddress,@Stelnum);9、插入订单信息功能:插入订单信息目的:存储插入订单信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_InsertOrders--插入订单表@Onumber char(12),@Odate date,,@Enumber char(12),@Cnumber char(12)asIF EXISTS(SELECT * FROM Orders WHERE Onumber=@Onumber)print' 该订单记录已经存在'ELSEinsert into Orders(Onumber,Odate,Enumber,Cnumber)values(@Onumber,@Odate,@Enumber,@Cnumber);10、插入产品订购信息功能:插入产品订购信息目的:存储插入产品订购信息的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_InsertPO--插入产品订购表@Pnumber char(12),@Onumber char(12),@Quantity intasIF EXISTS(SELECT * FROM PO WHERE Pnumber=@Pnumber and Onumber=@Onumber)--当该订单已经订购改产品时不予重复订购print' 该产品订购订单记录已经存在'IF EXISTS(SELECT * FROM Product WHERE Pinventory<@Quantity)--当库存量不足时不予订购print' 该产品库存不足,无法订购'ELSEinsert into PO(Onumber,Pnumber,Quantity)values(@Onumber,@Pnumber,@Quantity);11、插入产品信息功能:插入产品信息目的:存储产品的操作意义:下次重复同样的动作时,可直接执行存储过程,简化操作步骤create procedure procedure_InsertProduct --插入产品信息@Pnumber char(12),@Pname char(30),@Pcategory char(15),@Pprice int,@Pex_price real,@Pinventory realasIF EXISTS(SELECT * FROM Product WHERE Pnumber=@Pnumber)-- 若有相同产品,只更新库存量update Productset Pinventory=Pinventory+@PinventoryELSEinsert into Product(Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory)values(@Pnumber,@Pname,@Pcategory,@Pprice,@Pex_price,@Pinventory);12、完整的订单销售流程功能:插入订单信息和订购信息以及修改产品库存等信息目的:存储从客户下单到订单订购产品的流程的操作意义:直观展示订单销售流程,使用户能够更简明的执行完整的订单销售流程create procedure procedure_Order --完整的订单销售流程@Onumber char(12),@Odate date,,@Enumber char(12),@Cnumber char(12)@Pnumber char(12),@Onumber char(12),@Quantity intasIF EXISTS(SELECT * FROM Orders WHERE Onumber=@Onumber)-- 若有重复订单,则不予下单print' 该订单记录已存在,不能重复下订单'ELSEinsert into Orders(Onumber,Odate,Enumber,Cnumber)values(@Onumber,@Odate,@Enumber,@Cnumber);IF EXISTS(SELECT * FROM PO WHERE Pnumber=@Pnumber and Onumber=@Onumber)--若有重复订购单,则不予订购print' 该产品订购记录已存在,不能重复订购'ELSEIF EXISTS(SELECT * FROM Product WHERE Pinventory<@Quantity)--若产品库存量不足,则不予订购print' 产品库存量不足,不能订购'ELSEinsert into PO(Onumber,Pnumber,Quantity)values(@Onumber,@Pnumber,@Quantity);6.11触发器的设计1、建立触发器 insert_PO :当插入了一条新的产品订购信息后,则激活该触发器,新的产品库存量等于旧库存量减去产品订购的数量。