订单销售数据库设计.docx
《订单销售数据库设计.docx》由会员分享,可在线阅读,更多相关《订单销售数据库设计.docx(17页珍藏版)》请在冰豆网上搜索。
订单销售数据库设计
五、逻辑设计
5.1ER图
5.2关系模型
供应商(供应商编号,名称,地址,联系)
产品(产品编号,产品名称,产品类别,售价,出厂价,存货量)
供应(供应商编号,产品编号)
订购(产品编号,订单编号,数量)
客户(客户编号,,通信地址,)
订单(订单编号,日期,客户编号,雇员编号)
雇员(雇员编号,,联系,工资)
注:
有下划线的表示该属性为主码。
六、物理设计
6.1表汇总
表名
功能说明
表Suppliers
供应商表,存储供应商的编号等信息
表Product
产品表,存储产品的编号、数量等信息
表SP
供应商产品供应表,存储供应商所供应的产品对应信息
表Orders
订单表,存储订单的编号、日期等信息
表PO
产品订购表,存储产品订购的对应信息
表Employee
雇员表,存储雇员的编号等信息
表Customer
客户表,存储客户的编号等信息
6.2表[1]:
[Suppliers表](供应商表)
表名
Suppliers(供应商表)
数据库用户
Sa
主键
Snumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Snumber
char(12)
N
Y
高
无
主键/供应商号
2
Sname
char(30)
N
N
中
无
供应商名称
3
Saddress
char(30)
Y
N
中
无
供应商地址
4
Stelnum
int
Y
N
高
无
供应商
sql脚本
--建立供应商表
createtableSuppliers--供应商表
(Snumberchar(12)primarykey,--供应商编号,主码
Snamechar(30)notnull,--
Saddresschar(30),--地址
Stelnumint--
);
6.3表[2]:
[Product表](产品表)
表名
Product(产品表)
数据库用户
sa
主键
Pnumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Pnumber
char(12)
N
Y
高
无
主键/产品编号
2
Pname
char(30)
N
Y
高
无
产品名称
3
Pcategory
char(15)
Y
N
低
无
产品类别
4
Pprice
int
Y
N
中
无
产品售价
5
Pex_price
real
Y
N
中
无
产品出厂价
6
Pinventory
real
Y
N
中
无
产品库存量
sql脚本
--建立产品表
createtableProduct--产品表
(Pnumberchar(12)primarykey,--产品编号,主码
Pnamechar(30)notnull,--产品名称
Pcategorychar(15),--产品类别--
Ppriceint,--售价--
Pex_pricereal,--出厂价--
Pinventoryreal--存货量--
);
6.4表[3]:
[SP表](供应商产品供应表)
表名
SP(供应商产品供应表)
数据库用户
sa
主键
Snumber,Pnumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Snumber
char(12)
N
Y
高
无
主键/供应商号
2
Pnumber
char(12)
N
Y
高
无
主键/产品编号
sql脚本
--建立供应商产品供应表
createtableSP--供应商供应产品表--
(Snumberchar(12),--供应商编号,外码
Pnumberchar(12),--产品编号,外码
primarykey(Snumber,Pnumber),--联合主码
foreignkey(Pnumber)referencesProduct(Pnumber)
ondeletecascade
onupdatecascade,
foreignkey(Snumber)referencesSuppliers(Snumber)
ondeletecascade
onupdatecascade
);
6.5表[4]:
[Orders表](订单表)
表名
Orders(订单表)
数据库用户
sa
主键
Onumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Onumber
char(12)
N
Y
高
无
主键/订单号
2
Odate
date
N
N
低
无
订单日期
3
Enumber
char(12)
Y
N
中
无
雇员号
4
Cnumber
char(12)
N
N
高
无
客户号
sql脚本
--建立订单表
createtableOrders--订单表
(Onumberchar(12)primarykey,--编号,主码
Odatedate,--日期
Enumberchar(12),--设置雇员号,外码
Cnumberchar(12),--设置客户号,外码
foreignkey(Cnumber)referencesCustomer(Cnumber)
ondeletecascade
onupdatecascade,
foreignkey(Enumber)referencesEmployee(Enumber)
ondeletecascade
onupdatecascade
);
6.6表[5]:
[PO表](产品订购表)
表名
PO(产品订购表)
数据库用户
sa
主键
Pnumber,Onumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Pnumber
char(12)
N
Y
高
无
主键/产品号
2
Onumber
char(12)
N
Y
高
无
主键/订单号
3
Quantity
int
N
N
低
无
订购产品数量
sql脚本
--建立产品订购表
createtablePO--产品订购表
(Pnumberchar(12),--产品编号
Onumberchar(12),--订单编号
Quantityint,--产品数量
primarykey(Pnumber,Onumber),--联合主码
foreignkey(Pnumber)referencesProduct(Pnumber)--外码
ondeletecascade
onupdatecascade,
foreignkey(Onumber)referencesOrders(Onumber)--外码
ondeletecascade
onupdatecascade
);
6.7表[6]:
[Employee表](雇员表)
表名
Employee(雇员表)
数据库用户
sa
主键
Enumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Enumber
char(12)
N
Y
高
无
主键/雇员号
2
Ename
char(10)
N
N
中
无
雇员名称
3
Etelnum
int
N
Y
高
无
雇员
4
Ewages
real
N
N
低
无
雇员薪资
sql脚本
--建立雇员表
createtableEmployee--雇员表
(Enumberchar(12)primarykey,--编号
Enamechar(10),--名字
Etelnumint,--
Ewagesreal--工资
);
6.8表[7]:
[Customer表](客户表)
表名
Customer(客户表)
数据库用户
sa
主键
Cnumber
其他排序字段
无
索引字段
无
序号
字段名称
数据类型(精度围)
允许为空Y/N
唯一Y/N
区别度
默认值
约束条件/说明
1
Cnumber
char(12)
N
Y
高
无
主键/客户表
2
Cname
char(10)
N
N
中
无
客户名称
3
Caddress
char(30)
Y
N
中
无
客户地址
4
Ctelnum
int
Y
Y
高
无
客户
sql脚本
--建立客户表
createtableCustomer--客户表
(Cnumberchar(12)primarykey,--编号
Cnamechar(10),--
Caddresschar(30),--地址
Ctelnumint--
);
6.9视图的设计
1、建立一雇员信息的视图
目的:
屏蔽雇员的工资信息。
功能:
能够向管理员提供简明,直接的雇员信息展示。
意义:
有利于数据库安全的维护,防止任意修改数据库中的雇员信息。
createviewview_Employee--建立Employee视图,屏蔽工资属性
as
selectEnumber,Ename,Etelnum
fromEmployee
withcheckoption;
2、建立一产品信息的视图
目的:
屏蔽产品的出厂价信息。
功能:
能够向管理员提供简明,直接的产品信息展示。
意义:
有利于数据库安全的维护,防止任意修改数据库中的产品信息。
createviewview_Producte--建立Product视图,屏蔽出厂价属性
as
selectPnumber,Pname,Pcategory,Pprice,Pinventory
fromview_Producte
withcheckoption;
6.10存储过程的设计
1、查询订单数量
功能:
查询订单的数量目的:
存储查询订单数量的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchOrdersNum--查询订单的存储过程
AsselectCOUNT(*)'订单总数'--查询订单数量fromOrders;
2、查询客户的订单信息
功能:
查询客户的订单信息目的:
存储查询客户的订单信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_CustomerOrders--查询某个客户订单信息
Cnamechar(10)asselectOnumber,Odate,Enumber
fromOrders,Customer
whereCnamelikeCnameandCustomer.CnumberlikeOrders.Cnumber;
3、查询订单最多的客户信息
功能:
查询订单最多的客户信息目的:
存储查询订单最多的客户信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchMaxOrders--查询订单最多的客户信息
as
selectCnumber,Cname,Caddress,Ctelnum
fromOrders,Customer
whereOrders.Cnunmer=Customer.Cnunmer
groupbyCnumberhavingMAX(Cnumber);
4、查询客户信息
功能:
查询客户信息目的:
存储查询客户信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchCustomer--查询某客户信息
Cnamechar(10)
as
select*
fromCustomer
whereCname=Cname;
5、查询雇员信息
功能:
查询雇员信息目的:
存储查询雇员信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchEmployee--查询某雇员信息
Enamechar(10)
as
select*
fromEmployee
whereEname=Ename;
6、查询某订单对应的产品信息
功能:
查询某订单对应的产品信息目的:
存储查询某订单对应的产品信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchPO--查询某订单的产品信息
Onumberchar(12)
as
selectOnumber,Product.Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory
fromProduct,PO
whereOnumber=OnumberandPO.Pnumber=Product.Pnumber;
7、查询产品信息
功能:
查询产品信息目的:
存储查询产品信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_SearchProduct--查询某产品信息
Pnumberchar(12)
as
selectPnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory,Snumber
fromProduct,SP
wherePnumber=PnumberandSP.Pnumber=Pnumber;
8、插入供应商信息
功能:
插入供应商信息目的:
存储插入供应商信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_InsertSuppliers--插入供应商信息
Snumberchar(12),Snamechar(30),Saddresschar(30),Stelnumint
as
IFEXISTS(SELECT*FROMSuppliersWHERESnumber=Snumber)
print'该供应商记录已经存在'
ELSE
insertintoSuppliers(Snumber,Sname,Saddress,Stelnum)
values(Snumber,Sname,Saddress,Stelnum);
9、插入订单信息
功能:
插入订单信息目的:
存储插入订单信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_InsertOrders--插入订单表
Onumberchar(12),Odatedate,,Enumberchar(12),Cnumberchar(12)
as
IFEXISTS(SELECT*FROMOrdersWHEREOnumber=Onumber)
print'该订单记录已经存在'
ELSE
insertintoOrders(Onumber,Odate,Enumber,Cnumber)
values(Onumber,Odate,Enumber,Cnumber);
10、插入产品订购信息
功能:
插入产品订购信息目的:
存储插入产品订购信息的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_InsertPO--插入产品订购表
Pnumberchar(12),Onumberchar(12),Quantityint
as
IFEXISTS(SELECT*FROMPOWHEREPnumber=PnumberandOnumber=Onumber)--当该订单已经订购改产品时不予重复订购
print'该产品订购订单记录已经存在'
IFEXISTS(SELECT*FROMProductWHEREPinventoryprint'该产品库存不足,无法订购'
ELSE
insertintoPO(Onumber,Pnumber,Quantity)
values(Onumber,Pnumber,Quantity);
11、插入产品信息
功能:
插入产品信息目的:
存储产品的操作
意义:
下次重复同样的动作时,可直接执行存储过程,简化操作步骤
createprocedureprocedure_InsertProduct--插入产品信息
Pnumberchar(12),Pnamechar(30),Pcategorychar(15),Ppriceint,Pex_pricereal,Pinventoryreal
as
IFEXISTS(SELECT*FROMProductWHEREPnumber=Pnumber)--若有相同产品,只更新库存量
updateProduct
setPinventory=Pinventory+Pinventory
ELSE
insertintoProduct(Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory)
values(Pnumber,Pname,Pcategory,Pprice,Pex_price,Pinventory);
12、完整的订单销售流程
功能:
插入订单信息和订购信息以及修改产品库存等信息
目的:
存储从客户下单到订单订购产品的流程的操作
意义:
直观展示订单销售流程,使用户能够更简明的执行完整的订单销售流程
createprocedureprocedure_Order--完整的订单销售流程
Onumberchar(12),Odatedate,,Enumberchar(12),Cnumberchar(12)
Pnumberchar(12),Onumberchar(12),Quantityint
as
IFEXISTS(SELECT*FROMOrdersWHEREOnumber=Onumber)--若有重复订单,则不予下单
print'该订单记录已存在,不能重复下订单'
ELSE
insertintoOrders(Onumber,Odate,Enumber,Cnumber)
values(Onumber,Odate,Enumber,Cnumber);
IFEXISTS(SELECT*FROMPOWHEREPnumber=PnumberandOnumber=Onumber)--若有重复订购单,则不予订购
print'该产品订购记录已存在,不能重复订购'
ELSE
IFEXISTS(SELECT*FROMProductWHEREPinventoryprint'产品库存量不足,不能订购'
ELSE
insertintoPO(Onumber,Pnumber,Quantity)
values(Onumber,Pnumber,Quantity);
6.11触发器的设计
1、建立触发器insert_PO:
当插入了一条新的产品订购信息后,则激活该触发器,新的产品库存量等于旧库存量减去产品订购的数量。
功能:
能够根据数据库中数据的变化来自动进行数据更新操作。
目的:
将必备的操作自动化。
意义:
为数据库用户提供一种简便操作,省去了逐项更改数据的麻烦。
createtriggerinsert_PO--AFTER触发器,当订购产品后,自动减少库存量
onpoafterinsert
foreachrow
asbegin
updateProductsetnew.Pinventory=old.Pinventory-new.Quantity;
end;