《数据库设计:网上购物系统(初稿).docx》由会员分享,可在线阅读,更多相关《数据库设计:网上购物系统(初稿).docx(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数据库系统概论课程设计网上购物系统的数据库设计2012/6/14一、需求分析1.1功能需求及数据需求分析1.1.1用户管理 用户:只允许浏览商品信息,可以注册为普通用户 会员:拥有浏览商品和购买商品的权限,其属性包括客户号(唯一)、客户名、E-Mail、密码、姓名、性别、邮政编码、地址(一个客户可有几个地址)、客户所属VIP级别、折扣优惠。 1.1.2商品管理商品的增加。其中的属性包含商品号(唯一)、商品分类、生产厂商、每个厂商的实际存货量、规定的最低存货量和商品其它描述商品的查询,在只要输入商品的任一属性即可1.1.3商品订购管理注册用户即会员注册后可以将相关商品放入购物车,最后购物结束之后
2、形成生成订单,其中每个订单属性包含订单号、客户号、收货地址、订单日期、订单金额、订单明细(每个订单都有几个明细)内容为商品号、单价、订货数量。1.1.4配送单管理默认属性为客户注册时的基本信息,当然配送地址可由客户修改为合适的收货地址,支付方式也可根据提示由客户自定。1.1.5评论管理客户可以给商品发表评论,相关属性为评论号、客户号、商品号、客户邮箱、评论内容、评论时间。1.2业务规则分析1、 所用用户都有权限浏览商品信息,但只有注册用户才能订购商品2、 每位注册用户的编号都是唯一的。3、 当普通客户总的订单金额达到10000元,即可升级为VIP客户。VIP客户一般分为三个等级,对他们的优惠策
3、略是在普通客户的价格上同时享有折扣优惠。其中。三级会员,订单金额在10000,15000)元,享受折扣9折;二级会员,订单金额在15000,25000)元,享受折扣8.5折;一级会员,订单金额在25000及以上,享受折扣7.5折。4、 每次商品的订单号都是唯一的。5、 客户可以在前台页面查看订单状态,订单状态可以是“0”或“1”,“1”表示订单上的商品已发出, “0”表示订单上的商品未发出。订单的生成需用户确定之后才能生效。1.3业务需求及处理流程 网上购物系统主要业务包括:商品信息的发布与查询,商品的订购,处理订单,商品的配送。系统处理流程:系统流程图二、 概念结构设计2.1各子系统的局部E
4、-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.1 E-R图向关系模型的转换由于概念设计的结果是ER图,DBMS一般采用关系模型,因此数据库的逻辑设计过程就是把E-R图转化为关系模式的过程。将该网上购物系统的总体概念结构E-R图转换为关系模型:客户(客户号、密码、姓名、性别、单位、电子信箱、身份证号)VIP会员表(会员等级、会员折扣)商品(商
5、品号、商品名称、类别号、商品描述、单位、规格、单价)生产厂商表(厂商号,生产厂商名、地址、电话 )地址(地址号、地址名称)订单(订单号、客户号、商品号、收货地址、订货日期、订货数量、单价、订单金额、发货日期、订单状态)发票(发票号码、订单号)供应(商品号、厂商号)商品分类(商品类别号、类别名称)客户类型(客户号、客户类型)评论(评论号、客户号、商品号、客户邮箱、评论内容、评论时间)客户地址表(客户号、客户地址)3.2数据模型的优化数据模数据模型的优化是为了提高数据库应用系统的性能,根据应用需要适当地修改、调整关系模式。将转化的关系模式进行优化,最终达到第三范式。由以上关系可看出,这个关系模型都
6、已经达到第三范式,所以不需要进行优化。型的优化数据库的结构1. 创建客户表字段信息: 客户号customerNo 密码password 姓名customerName类型号typeNo性别sex单位company电子信箱email身份证号IDVIP等级VIPCreate table customer(customerNochar(12)primanykey,passwordvarchar(18)NotNull,customerNamevarchar(12)NotNull,typeNochar(8)NotNull,sexchar(1)Check(sex In(M,F) companyvarchar
7、(20)NotNull,emailvarchar(50)NotNull,IDvarchar(18)NotNull,VIPchar(1)2. 创建VIP会员表字段信息: 会员等级VIP会员折扣discountCreatetableVIP(VIPchar(1)primanykey,Discount floatNot Null,)3. 创建商品表字段信息: 商品号productNo商品名称productName类别号typeNo商品描述describe单位uints规格standard单价priceCreatetableproduct(ProductNochar(12)primany key,Pro
8、ductNamevarchar(18)Not Null,typeNochar(12)Not Null,describevarchar(50) Not Null,unitsvarchar(20)Not Null,standardchar(8)Not Null,pricenumericNot Null,)4. 创建生产厂商表字段信息: 厂商号producerNo厂商名producerName地址address电话telephoneCreatetable producer(producerNochar(12)primany key,producerName varchar(18)Not Null,a
9、ddressvarchar(50)Not Null,telephonevarchar(12)Not Null)5. 创建商品类别表字段信息: 类别号protypeNo类别名称protypeNameCreatetable protype(protypeNochar(12)primany key,protypeName varchar(18)Not Null)6. 创建地址表字段信息:地址号addressNo地址名称addressNameCreatetable address(addressNochar(12)primarykey,addressvarchar(20)Not Null,)7. 创建
10、订单明细表字段信息: 订单号orderNo客户号customerNo商品号productNo收货地址address订货日期orderdate订货数量quantity单价price发票号码billNo订单金额ordersum发货日期Fhdate订单状态orderstateCreatetable order(orderNochar(12)primany key,customerNochar(12)Not Null,productNochar(12)Not Null,addressvarchar(20)Not Null,orderdatedatetimeNot Null,quantitychar(4
11、)Not Null,pricenumericNot Null,billNovarchar(12)primany key,FhdatedatetimeNot Null,Orderstatechar(8)Check(orderstate IN(0,1),foreign key(customerNo) references customer(customerNo)foreign key(productNo) references product(productNo)8. 创建发票表字段信息: 发票号码billNo订单号orderNoCreatetablebill(billNochar(12)prim
12、any key,orderNochar(12)NOT NULL)foreign key(orderNo) references product(orderNoNo) )9. 创建供应表字段信息: 商品号productNo厂商号producerNoCreatetablesupport(productNochar(12)primany key,producerNochar(12)primany key,foreign key(producerNo) references producer(producerNo),foreign key(productNo) references product(p
13、roductNo) )10. 创建客户类型表:字段信息: 客户号customerNo客户类型typeCreatetabletype(CustomerNochar(12)primany key,Typevarchar(18)Not Null)11. 创建评论表字段信息: 评论号reviewNo客户号customerNo商品号productNo客户邮箱email评论内容reviewContent评论时间reviewdateCreatetablereview(reviewNochar(12)primany key,customerNochar(12)Not Null,produtNochar(12)
14、Not Null,emailvarchar(50)Not Null,reviewContentvarchar(100)Not Null,reviewdatedatetimeNot Null,foreign key(customerNo) references customer(customerNo),foreign key(productNo) references product(productNo)12. 创建客户地址表字段信息:客户号customerNo客户地址cusaddressCreatetablecusaddress(customerNochar(12)primany key,cu
15、saddressvarchar(100)Not Null) 12 创建客户消费情况表字段信息 客户号 customerNo 消费金额 moneycreate table cost(customerNo varchar2(20 primary key),money number not null)这里我们保证了实体完整性,参照完整性和用户自定义完整性。在各个基本表的定义中,我们使主码值均不为空,表orderitem中ORDER_ID取值为表myorder中的主码值,而且我们还进行了用户自定义的完整性约束,使表中某些值取值不为空。四、数据库的实施4.1数据库的载入4.1.1创建数据库shoponl
16、inecreatedatabase shoponlineon(Name=shoponline, Filename=f:SQLshoponline.mdf, Size=2, Maxsize=20, Filegrowth=1)Log on(name=shoponlinelog, Filename=f;SQLshoponlinelog.ldf, Size=2, Maxsize=5, Filegrowth=1)4.1.2表的建立与数据的载入 需要明确数据库需要建立几张表,以及每个表中所要包括的属性。在建立表的过程中。要对每个表进行字段属性的设置。(创建表过程见三、数据库的逻辑设计)4.1.3触发器的设
17、计在修改商品价格的时候,新的商品价格不能超过原来价格的2倍,否则修改不成功,依此设计一个触发器。触发器设计如下:/*创建触发器T1,实现注册客户VIP自动升级*/Create Trigger T1 ON customerFor updateAsIF Update(ordersum)BeginDeclare price As numericSelect price=ordersum From insertedIf price=30000Update customer set VIP=4ElseIf price=20000Update customer set VIP=3ElseIf price=
18、10000Update customer set VIP=2ElseIf price=0Update customer set VIP=1End/*创建一个触发器,只允许注册会员在网上提交订单*/Create Trigger T2 on orderFor insertAsIf Not Exists(select * From insertedWhere customerNo in(select customer.customerNo from customer)BeginRaiserror(提交订单前请先注册!,16,1)Rollback TransactionEnd/*创建一个触发器T3,统
19、计订单金额*/*创建一个更新触发器,及时更新订单*/Create Trigger updatesaleitem On order For Update AsIf Update (quantity) Or Update (price)Begin Declare orderNo int,productNo char(12)Declare cur_order Cursor ForSelect orderNo,productNo From DeletedOpen cur_orderBegin Transaction Fetch cur_order into orderNo,productNoWhile
20、 (fetch_status=0)Begin Update orderSet ordersum=ordersum-D.quantity*D.price+I.quantity*I.priceFrom inserted I,deleted DWhere order.orderNo=I.orderNo And I.orderNo=D.orderNoAnd order.orderNo=orderNo And I.productNo=D.productNoAnd I.productNo=productNoFetch cur_order into orderNo,productNoEndCommit te
21、anClose cur_orderDeallocate cur_orderEnd 4.2数据库的运行附录:源程序IF Not exists (select * from syslogins where name=u1)Exec sp_addlogin u1,u1GoIF Not exists (select * from sysdatabases where name=shoponline)Drop database shoponlineGocreatedatabase shoponlineon(Name=shoponline, Filename=f:SQLshoponline.mdf, Si
22、ze=2, Maxsize=20, Filegrowth=1)Log on(name=shoponlinelog, Filename=f;SQLshoponlinelog.ldf, Size=2, Maxsize=5, Filegrowth=1)Use shoponlineGoExec sp_addlogin u1,u1GoCreate table customer(customerNochar(12)primanykey,passwordvarchar(18)NotNull,customerNamevarchar(12)NotNull,typeNochar(8)NotNull,sexchar
23、(1)Check(sex In(M,F) companyvarchar(20)NotNull,emailvarchar(50)NotNull,IDvarchar(18)NotNull,VIPchar(1)CreatetableVIP(VIPchar(1)primanykey,Discount floatNot Null,)Createtableproduct(ProductNochar(12)primany key,ProductNamevarchar(18)Not Null,typeNochar(12)Not Null,describevarchar(50) Not Null,unitsva
24、rchar(20)Not Null,standardchar(8)Not Null,pricenumericNot Null,)Createtable producer(producerNochar(12)primany key,producerName varchar(18)Not Null,addressvarchar(50)Not Null,telephonevarchar(12)Not Null)Createtable protype(protypeNochar(12)primany key,protypeName varchar(18)Not Null)Crestetable add
25、ress(addressNochar(12)primanykey,addressvarchar(20)Not Null,)Createtable order(orderNochar(12)primany key,customerNochar(12)Not Null,productNochar(12)Not Null,addressvarchar(20)Not Null,orderdatedatetimeNot Null,quantitychar(4)Not Null,pricenumericNot Null,billNovarchar(12)primany key,Fhdatedatetime
26、Not Null,Orderstatechar(8)Check(orderstate IN(0,1),foreign key(customerNo) references customer(customerNo)foreign key(productNo) references product(productNo)Createtablebill(billNochar(12)primany key,orderNochar(12)primany key,foreign key(orderNo) references product(orderNoNo) )Createtablesupport(pr
27、oductNochar(12)primany key,producerNochar(12)primany key,foreign key(producerNo) references producer(producerNo),foreign key(productNo) references product(productNo) )Createtabletype(CustomerNochar(12)primany key,Typevarchar(18)Not Null)Createtablereview(reviewNochar(12)primany key,customerNochar(12
28、)Not Null,produtNochar(12)Not Null,emailvarchar(50)Not Null,reviewContentvarchar(100)Not Null,reviewdatedatetimeNot Null,foreign key(customerNo) references customer(customerNo),foreign key(productNo) references product(productNo)Createtablecusaddress(customerNochar(12)primany key,cusaddressvarchar(1
29、00)Not Null)/*创建触发器T1,实现注册客户VIP自动升级*/Create Trigger T1 ON customerFor updateAsIF Update(ordersum)BeginDeclare price As numericSelect price=ordersum From insertedIf price=30000Update customer set VIP=4ElseIf price=20000Update customer set VIP=3ElseIf price=10000Update customer set VIP=2ElseIf price=0
30、Update customer set VIP=1End/*创建一个触发器,只允许注册会员在网上提交订单*/Create Trigger T2 on orderFor insertAsIf Not Exists(select * From insertedWhere customerNo in(select customer.customerNo from customer)BeginRaiserror(提交订单前请先注册!,16,1)Rollback TransactionEnd/*创建一个更新触发器,及时更新订单*/Create Trigger updatesaleitem On orde
31、r For Update AsIf Update (quantity) Or Update (price)Begin Declare orderNo int,productNo char(12)Declare cur_order Cursor ForSelect orderNo,productNo From DeletedOpen cur_orderBegin Transaction Fetch cur_order into orderNo,productNoWhile (fetch_status=0)Begin Update orderSet ordersum=ordersum-D.quantity*D.price+I.quantity*I.priceFrom inserted I,deleted DWhere order.orderNo=I.orderNo And I.orderNo=D.orderNoAnd order.orderNo=orderNo And I.productNo=D.productNoAnd I.productNo=productNoFetch cur_order into orderNo,productNoEndCommit teanClose cur_orderDeallocate cur_orderEnd
限制150内