数据库设计网上购物系统初稿.docx
《数据库设计网上购物系统初稿.docx》由会员分享,可在线阅读,更多相关《数据库设计网上购物系统初稿.docx(25页珍藏版)》请在冰豆网上搜索。
数据库设计网上购物系统初稿
数据库系统概论课程设计
——网上购物系统的数据库设计
2012/6/14
一、需求分析
1.1功能需求及数据需求分析
1.1.1用户管理
①用户:
只允许浏览商品信息,可以注册为普通用户
②会员:
拥有浏览商品和购买商品的权限,其属性包括客户号(唯一)、客户名、E-Mail、密码、姓名、性别、邮政编码、地址(一个客户可有几个地址)、客户所属VIP级别、折扣优惠。
1.1.2商品管理
①商品的增加。
其中的属性包含商品号(唯一)、商品分类、生产厂商、每个厂商的实际存货量、规定的最低存货量和商品其它描述
②商品的查询,在只要输入商品的任一属性即可
1.1.3商品订购管理
注册用户即会员注册后可以将相关商品放入购物车,最后购物结束之后形成生成订单,其中每个订单属性包含订单号、客户号、收货地址、订单日期、订单金额、订单明细(每个订单都有几个明细)内容为商品号、单价、订货数量。
1.1.4配送单管理
默认属性为客户注册时的基本信息,当然配送地址可由客户修改为合适的收货地址,支付方式也可根据提示由客户自定。
1.1.5评论管理
客户可以给商品发表评论,相关属性为评论号、客户号、商品号、客户邮箱、评论内容、评论时间。
1.2业务规则分析
1、所用用户都有权限浏览商品信息,但只有注册用户才能订购商品
2、每位注册用户的编号都是唯一的。
3、当普通客户总的订单金额达到10000元,即可升级为VIP客户。
VIP客户一般分为三个等级,对他们的优惠策略是在普通客户的价格上同时享有折扣优惠。
其中。
三级会员,订单金额在[10000,15000)元,享受折扣9折;二级会员,订单金额在[15000,25000)元,享受折扣8.5折;一级会员,订单金额在25000及以上,享受折扣7.5折。
4、每次商品的订单号都是唯一的。
5、客户可以在前台页面查看订单状态,订单状态可以是“0”或“1”,“1”表示订单上的商品已发出,“0”表示订单上的商品未发出。
订单的生成需用户确定之后才能生效。
1.3业务需求及处理流程
网上购物系统主要业务包括:
商品信息的发布与查询,商品的订购,处理订单,商品的配送。
系统处理流程:
系统流程图
二、概念结构设计
2.1各子系统的局部E-R如下:
图2.1.1:
客户实体
图2.1.2:
VIP客户
图2.1.3:
商品实体
图2.1.4:
生产厂商实体
图2.1.5:
商品分类
图2.1.6:
地址实体
图2.1.7:
订单明细
图2.1.8:
发票
图2.1.9:
供应关系
图2.1.10:
商品分类关系
图2.1.11:
客户评论关系
2.2视图的集成
三、逻辑结构设计
3.1E-R图向关系模型的转换
由于概念设计的结果是ER图,DBMS一般采用关系模型,因此数据库的逻辑设计过程就是把E-R图转化为关系模式的过程。
将该网上购物系统的总体概念结构E-R图转换为关系模型:
客户(客户号、密码、姓名、性别、单位、电子信箱、身份证号)
VIP会员表(会员等级、会员折扣)
商品(商品号、商品名称、类别号、商品描述、单位、规格、单价)
生产厂商表(厂商号,生产厂商名、地址、电话)
地址(地址号、地址名称)
订单(订单号、客户号、商品号、收货地址、订货日期、订货数量、单价、订单金额、发货日期、订单状态)
发票(发票号码、订单号)
供应(商品号、厂商号)
商品分类(商品类别号、类别名称)
客户类型(客户号、客户类型)
评论(评论号、客户号、商品号、客户邮箱、评论内容、评论时间)
客户地址表(客户号、客户地址)
3.2数据模型的优化
数据模数据模型的优化是为了提高数据库应用系统的性能,根据应用需要适当地修改、调整关系模式。
将转化的关系模式进行优化,最终达到第三范式。
由以上关系可看出,这个关系模型都已经达到第三范式,所以不需要进行优化。
型的优化
数据库的结构
1.创建客户表
字段信息:
客户号customerNo
密码password
姓名customerName
类型号typeNo
性别sex
单位company
电子信箱email
身份证号ID
VIP等级VIP
Createtablecustomer(
customerNochar(12)primanykey,
passwordvarchar(18)NotNull,
customerNamevarchar(12)NotNull,
typeNochar(8)NotNull,
sexchar
(1)Check(sexIn(‘M’,‘F’)
companyvarchar(20)NotNull,
emailvarchar(50)NotNull,
IDvarchar(18)NotNull,
VIPchar
(1)
)
2.创建VIP会员表
字段信息:
会员等级VIP
会员折扣discount
CreatetableVIP(
VIPchar
(1)primanykey,
DiscountfloatNotNull,
)
3.创建商品表
字段信息:
商品号productNo
商品名称productName
类别号typeNo
商品描述describe
单位uints
规格standard
单价price
Createtableproduct(
ProductNochar(12)primanykey,
ProductNamevarchar(18)NotNull,
typeNochar(12)NotNull,
describevarchar(50)NotNull,
unitsvarchar(20)NotNull,
standardchar(8)NotNull,
pricenumericNotNull,
)
4.创建生产厂商表
字段信息:
厂商号producerNo
厂商名producerName
地址address
电话telephone
Createtableproducer(
producerNochar(12)primanykey,
producerNamevarchar(18)NotNull,
addressvarchar(50)NotNull,
telephonevarchar(12)NotNull
)
5.创建商品类别表
字段信息:
类别号protypeNo
类别名称protypeName
Createtableprotype(
protypeNochar(12)primanykey,
protypeNamevarchar(18)NotNull
)
6.创建地址表
字段信息:
地址号addressNo
地址名称addressName
Createtableaddress(
addressNochar(12)primarykey,
addressvarchar(20)NotNull,
)
7.创建订单明细表
字段信息:
订单号orderNo
客户号customerNo
商品号productNo
收货地址address
订货日期orderdate
订货数量quantity
单价price
发票号码billNo
订单金额ordersum
发货日期Fhdate
订单状态orderstate
Createtableorder(
orderNochar(12)primanykey,
customerNochar(12)NotNull,
productNochar(12)NotNull,
addressvarchar(20)NotNull,
orderdatedatetimeNotNull,
quantitychar(4)NotNull,
pricenumericNotNull,
billNovarchar(12)primanykey,
FhdatedatetimeNotNull,
Orderstatechar(8)Check(orderstateIN(‘0’,‘1’)),
foreignkey(customerNo)referencescustomer(customerNo)
foreignkey(productNo)referencesproduct(productNo)
)
8.创建发票表
字段信息:
发票号码billNo
订单号orderNo
Createtablebill(
billNochar(12)primanykey,
orderNochar(12)NOTNULL)
foreignkey(orderNo)referencesproduct(orderNoNo)
)
9.创建供应表
字段信息:
商品号productNo
厂商号producerNo
Createtablesupport(
productNochar(12)primanykey,
producerNochar(12)primanykey,
foreignkey(producerNo)referencesproducer(producerNo),
foreignkey(productNo)referencesproduct(productNo)
)
10.创建客户类型表:
字段信息:
客户号customerNo
客户类型type
Createtabletype(
CustomerNochar(12)primanykey,
Typevarchar(18)NotNull
)
11.创建评论表
字段信息:
评论号reviewNo
客户号customerNo
商品号productNo
客户邮箱email
评论内容reviewContent
评论时间reviewdate
Createtablereview(
reviewNochar(12)primanykey,
customerNochar(12)NotNull,
produtNochar(12)NotNull,
emailvarchar(50)NotNull,
reviewContentvarchar(100)NotNull,
reviewdatedatetimeNotNull,
foreignkey(customerNo)referencescustomer(customerNo),
foreignkey(productNo)referencesproduct(productNo)
)
12.创建客户地址表
字段信息:
客户号customerNo
客户地址cusaddress
Createtablecusaddress(
customerNochar(12)primanykey,
cusaddressvarchar(100)NotNull
)
12创建客户消费情况表
字段信息客户号customerNo
消费金额money
createtablecost(
customerNovarchar2(20primarykey),
moneynumbernotnull)
这里我们保证了实体完整性,参照完整性和用户自定义完整性。
在各个基本表的定义中,我们使主码值均不为空,表orderitem中ORDER_ID取值为表myorder中的主码值,而且我们还进行了用户自定义的完整性约束,使表中某些值取值不为空。
四、数据库的实施
4.1数据库的载入
4.1.1创建数据库shoponline
create databaseshoponline
on
(Name=’shoponline’,
Filename=’f:
\SQL\shoponline.mdf’,
Size=2,
Maxsize=20,
Filegrowth=1)
Logon
(name=’shoponlinelog’,
Filename=’f;\SQL\shoponlinelog.ldf’,
Size=2,
Maxsize=5,
Filegrowth=1)
4.1.2表的建立与数据的载入
需要明确数据库需要建立几张表,以及每个表中所要包括的属性。
在建立表的过程中。
要对每个表进行字段属性的设置。
(创建表过程见三、数据库的逻辑设计)
4.1.3触发器的设计
在修改商品价格的时候,新的商品价格不能超过原来价格的2倍,否则修改不成功,依此设计一个触发器。
触发器设计如下:
/*创建触发器T1,实现注册客户VIP自动升级*/
CreateTriggerT1ONcustomer
Forupdate
As
IFUpdate(ordersum)
Begin
Declare@priceAsnumeric
Select@price=ordersumFrominserted
If@price>=30000
UpdatecustomersetVIP=’4’
Else
If@price>=20000
UpdatecustomersetVIP=’3’
Else
If@price>=10000
UpdatecustomersetVIP=’2’
Else
If@price>=0
UpdatecustomersetVIP=’1’
End
/*创建一个触发器,只允许注册会员在网上提交订单*/
CreateTriggerT2onorder
Forinsert
As
IfNotExists
(select*Frominserted
WherecustomerNoin(selectcustomer.customerNofromcustomer))
Begin
Raiserror(‘提交订单前请先注册!
’,16,1)
RollbackTransaction
End
/*创建一个触发器T3,统计订单金额*/
/*创建一个更新触发器,及时更新订单*/
CreateTriggerupdatesaleitemOnorderForUpdateAs
IfUpdate(quantity)OrUpdate(price)
Begin
Declare@orderNoint,@productNochar(12)
Declarecur_orderCursorFor
SelectorderNo,productNoFromDeleted
Opencur_order
BeginTransaction
Fetchcur_orderinto@orderNo,@productNo
While(@@fetch_status=0)
Begin
Updateorder
Setordersum=ordersum-D.quantity*D.price+I.quantity*I.price
FrominsertedI,deletedD
Whereorder.orderNo=I.orderNoAndI.orderNo=D.orderNo
Andorder.orderNo=@orderNoAndI.productNo=D.productNo
AndI.productNo=@productNo
Fetchcur_orderinto@orderNo,@productNo
End
Committean
Closecur_order
Deallocatecur_order
End
4.2数据库的运行
附录:
源程序
IFNotexists(select*fromsysloginswherename=’u1’)
Execsp_addloginu1,u1
Go
IFNotexists(select*fromsysdatabaseswherename=’shoponline’)
Dropdatabaseshoponline
Go
create databaseshoponline
on
(Name=’shoponline’,
Filename=’f:
\SQL\shoponline.mdf’,
Size=2,
Maxsize=20,
Filegrowth=1)
Logon
(name=’shoponlinelog’,
Filename=’f;\SQL\shoponlinelog.ldf’,
Size=2,
Maxsize=5,
Filegrowth=1)
Useshoponline
Go
Execsp_addloginu1,u1
Go
Createtablecustomer(
customerNochar(12)primanykey,
passwordvarchar(18)NotNull,
customerNamevarchar(12)NotNull,
typeNochar(8)NotNull,
sexchar
(1)Check(sexIn(‘M’,‘F’)
companyvarchar(20)NotNull,
emailvarchar(50)NotNull,
IDvarchar(18)NotNull,
VIPchar
(1)
)
CreatetableVIP(
VIPchar
(1)primanykey,
DiscountfloatNotNull,
)
Createtableproduct(
ProductNochar(12)primanykey,
ProductNamevarchar(18)NotNull,
typeNochar(12)NotNull,
describevarchar(50)NotNull,
unitsvarchar(20)NotNull,
standardchar(8)NotNull,
pricenumericNotNull,
)
Createtableproducer(
producerNochar(12)primanykey,
producerNamevarchar(18)NotNull,
addressvarchar(50)NotNull,
telephonevarchar(12)NotNull
)
Createtableprotype(
protypeNochar(12)primanykey,
protypeNamevarchar(18)NotNull
)
Crestetableaddress(
addressNochar(12)primanykey,
addressvarchar(20)NotNull,
)
Createtableorder(
orderNochar(12)primanykey,
customerNochar(12)NotNull,
productNochar(12)NotNull,
addressvarchar(20)NotNull,
orderdatedatetimeNotNull,
quantitychar(4)NotNull,
pricenumericNotNull,
billNovarchar(12)primanykey,
FhdatedatetimeNotNull,
Orderstatechar(8)Check(orderstateIN(‘0’,‘1’)),
foreignkey(customerNo)referencescustomer(customerNo)
foreignkey(productNo)referencesproduct(productNo)
)
Createtablebill(
billNochar(12)primanykey,
orderNochar(12)primanykey,
foreignkey(orderNo)referencesproduct(orderNoNo)
)
Createtablesupport(
productNochar(12)primanykey,
producerNochar(12)primanykey,
foreignkey(producerNo)referencesproducer(producerNo),
foreignkey(productNo)referencesproduct(productNo)
)
Createtabletype(
CustomerNochar(12)primanykey,
Typevarchar(18)NotNull
)
Createtablereview(
reviewNochar(12)primanykey,
customerNochar(12)NotNull,
produtNochar(12)NotNull,
emai