1、一、概述1.1 需求背景伴着电子时代的迅猛发展和人民物质生活的水平的提高, 越来越多的电子购物浪潮也汹涌而来。 我们容身在这个信息化的大时代, 网购也就成了许多人生活中必不可少的一部分, 足不出户的便捷式购物与传统的购物方式大相径庭, 人们在享受到方便、 实惠的同时也不必担忧安全的问题, 既方便了自身也推动着国家经济的发展。电子商务网络购物平台,无疑是这个时代的进步。1.2 编写目的数据库设计说明书是数据库设计的必要部分,对设计中的数据库的所有标识、 逻辑结构和物理结构作出具体的设计规定。 本数据库的设计说明书编写的目的是对网上购物系统设计的说明, 明确系统中的各项功能与非功能的需求, 从而做
2、出系统的数据流图以及实体联系图。 作为系统的基准文档, 为以后的开发和维护提供依据。1.3 软件定义Myeclipse 10.0:一个非常优秀的用于开发 Java、 J2EE 的 Eclipse 插件集合,Myeclipse 功能非常强大, 支持也十分广泛, 尤其对各种开源产品的支持也不错。Apache Tomcat 6.0:是一个开放源代码、运行 servlet和 JSP Web应用软件容器。Microsoft SQL Server 2005:Structured Query Language 1.4 开发环境本电子商务网络购物平台的开发环境是 Windows 7、 Myeclipse10.
3、0、 Apache Tomcat6.0,数据库环境是 Microsoft SQL Server 2005。二、需求分析2.1 问题陈述设计网络购物系统的数据库。2.1 需完成的功能客户功能: (1) 游客可以查看商品信息,浏览网站信息,经过注册可以成为注册客户。 (2) 注册客户:注册、客户信息查看和修改。客户登录、确认客户信息,显示客户信息。商品信息浏览、购物车管理、商品查找、订单查询以及商品评论。结账、确认订单、订单状态查询、历史订单查询。商家功能:商品的增删改。订单处理、订单配送。客户注册后,登录到电子商务网站,进入购物流程。客户在浏览所有商品信息后, 可以查看每个商品的详细信息, 选择
4、购买或加入购物车, 购物车内可以随意增删商品, 修改商品数量, 并同时统计购物车内商品总额。客户确认购物车内的商品,选中购买,即可生成订单。可以查看订单状态,“ 0 表示”商品未发出, “ 1”表示商品已发出。客户分为普通客户和 VIP 客户,依据购买商品的金额和数量,自动升级。不同的 VIP 等级享有不同的折扣。2.1 数据流图网络购物系统总数据流图如下订单信息表客户商家1.0查看商品3.0生成订单商品信息2.0管理购物车商 品信 息结 算数 据4.0处理订单5.0支付过账6.0开发票发票信息表发票数据商品信息核对通过订单细节7.0管理商品 商家信息表 注册信息订购信息管理员8.0管理顾客核
5、对通过订单信息商家信息表商品信息商品信息购买方式游客VIP 会员9.0注册客户10.0修改客户信息注册信息不成功成功 升级信息折扣信息客户信息客户信息表 客户信息更改信息图 1: 网络购物系统总数据流图2.1 数据字典客户表数据字典:字段 中文描述 数据类型 是否为空 备注UserID 客户 ID BigInt Not null 主键UserName 客户名 Varchar(30) Not null RealName 客户真实姓名 Varchar(30) Not null UserPassword 客户密码 Varchar(30) Not null Email 客户邮箱 Varchar(30)
6、 Not null Phone 联系电话 Varchar(30) Not null ID 身份证号 Varchar(30) Not null Question 密码问题 Varchar(30) Null Result 答案 Varchar(30) Null RegTime 注册时间 Datetime Not null GradeID 会员等级 BigInt Not null AddressID 地址 Int Not null 表 1:客户表字段信息商品表数据字典:字段 中文描述 数据类型 是否为空 备注GoodsID 商品号 BigInt Not null 主键GName 商品名称 Varch
7、ar(30) Not null GPrice 商品价格 Smallmoney Not null GTypeID 商品类别 BigInt Not null GIntro 商品描述 Varchar(200) Null GImage 商品图片路径 Varchar(100) Null GCount 商品计数 Int Not null GSail 商品销量 BigInt Not null GWeight 商品重量 BigInt Null GDateTime 上架日期 Datetime Not null GSize 商品规格 Varchar(100) Not null 表 2:商品表字段信息商品类别表数据
8、字典:字段 中文描述 数据类型 是否为空 备注TypeID 商品类别号 BigInt Not null 主键TypeName 类别描述 Varchar(50) Not null 表 3:商品类别表字段信息商家表数据字典:字段 中文描述 数据类型 是否为空 备注ProducerID 商家号 BigInt Not null 主键ProName 商家名 Varchar(30) Not null ProAddress 商家地址 Varchar(50) Not null ProPhone 商家电话 Varchar(30) Not null 表 4:商家表字段信息订单表数据字典:字段 中文描述 数据类型
9、是否为空 备注SubID 订单号 Varchar(30) Not null 主键UserID 客户号 BigInt Not null GoodsID 商品号 BigInt Not null RAddress 送货地址 Varchar(50) Not null SpDate 订购日期 Datetime Not null SpCount 订购数量 Int Not null GPrice 单价 Smallmoney Not null ReceiptID 发票号 BigInt Not null SpPrice 订单金额 Money Not null SendDate 发货时间 Datetime Not
10、 null Payment 付款方式 Varchar(20) Not null SendType 运送方式 Varchar(20) Not null SendPrice 邮费 Smallmoney Not null State 订单状态 Int Not null 表 5:订单表字段信息购物车表数据字典:字段 中文描述 数据类型 是否为空 备注CarID 购物车 ID BigInt Not null 主键UserID 客户 ID Varchar(10) Not null GoodsID 商品 ID Varchar(20) Not null OrderTime 订购时间 Datetime Not
11、null OrderCount 订购数量 Int Not null GoodsPrice 单价 Smallmoney Not null UserCheck 用户确认 Int Not null OrderPrice 购物总额 Money Not null 表 6:购物车表字段信息会员等级表数据字典:字段 中文描述 数据类型 是否为空 备注GradeID 会员等级 ID BigInt Not null 主键GradeType 等级分类 Int Not null 表 7:会员等级表字段信息评论表数据字典:字段 中文描述 数据类型 是否为空 备注CommentID 评论 ID BigInt Not n
12、ull 主键Content1 内容 Varchar(200) Not null Title 标题 Varchar(20) Not null UserID 客户 ID BigInt Not null ProducerID 商家 ID BigInt Not null CommentTime 评论时间 Datetime Not null 表 8:评论表字段信息供应表数据字典:字段 中文描述 数据类型 是否为空 备注SupplyID 供应 ID BigInt Not null 主键RealStock 实际存货 Int Not null MinStock 最低存货 Int Not null GoodsI
13、D 商品 ID BigInt Not null ProducerID 商家 ID BigInt Not null 表 9:供应表字段信息发票表数据字典:字段 中文描述 数据类型 是否为空 备注ReceiptID 发票 ID BigInt Not null 主键SubID 订单号 BigInt Not null 表 10:发票表字段信息地址表数据字典:字段 中文描述 数据类型 是否为空 备注AddressID 地址 ID Int Not null 主键Address 地址 Varchar(50) Not null UserID 客户 ID BigInt Not null 表 11:发票表字段信息
14、三、数据库概念结构设计3.1 E-R 模型图的设计( 1)寻找实体集客户 VIP 会员 商品 商家 商品类别 地址( 2)寻找实体间联系客户与商品之间多对多联系:订单,评论1 客户与 VIP 会员之间多对一联系:属于2 会员等级与订单细节一对多:参照 1 3 订单细节与商品多对一:参照 2 4 订单细节预订单多对一:组成客户与商品之间一对多联系:购物车1 客户与购物车一对一:拥有2 购物车与商品一对多:存放3 购物车与订单细节一对多:结算商家与商品之间多对多联系:供应商品与商品类别之间多对一联系:分类客户与地址之间一对多联系:所在( 3)确定实体的属性客户:客户 ID 客户名 客户真实姓名 客
15、户密码 客户邮箱 联系电话身份证号 密码问题 答案 注册时间 会员等级 IDVIP 会员:会员等级 ID 等级分类商品:商品号 商品名称 商品价格 商品类别 商品描述商品图片路径 商品计数 商品销量 商品重量 上架日期 商品规格商家:商家号 商家名 商家地址 商家电话地址:地址号 地址名称商品类别:商品类别号 类别描述( 3)确定联系的属性订单:订单号 客户号 商品号 送货地址 订购日期 订购数量 单价发票号 订单金额 发货时间 付款方式 运送方式 邮费 订单状态购物车:购物车 ID 客户 ID 商品 ID 订购时间 订购数量 单价用户确认供应:供应 ID 实际存货 最低存货 商品 ID 商家
16、 ID分类:商品号 商品分类客户类型属于:客户号 客户类型评论:评论 ID 内容 标题 客户 ID 商家 ID 评论时间客户地址所在 : 客户号 客户地址( 4)画出 E-R 图客户订单细节商品购物车订单会员等级拥有组成存放结算参照 1属于核对状态参照 2n1 n11 1n1n1nn1图 2:客户与商品实体间的详细联系 E-R 图购物车客户商品类型客户类型VIP 会员地址商家商品评论订单 供应分类属于属于所在nn1n11mnmnmm nn1图 3:网络购物系统 E-R 图四、数据库逻辑结构设计4.1 E-R 模型图转化为关系表( 1)实体转化为单独的一张表客户 VIP 会员 商品 商家 商品类
17、别 地址( 2)多对多联系转化为单独的一张关系表购物车 订单 评论 供应( 3)其他一对多的联系通过在多的一方增加属性来实现客户表与会员等级:在客户表中增加会员等级 ID 商品与商品类型:在商品中增加类型号4.2 描述基本表的关系E-R图转化为关系模型,关系的码用下划线标出。此为客户实体对应的关系模式:客户 ( 客户号,密码,会员等级号,, ) 此为 VIP 会员实体对应的关系模式:VIP 会员 ( 会员等级号,等级类型 ) 此为商品实体对应的关系模式:商品 ( 商品号,描述,商品分类,商品名,, ) 此为商家实体对应的关系模式:商家 ( 商家号,商家名,商家电话,, ) 此为商品类别实体对应
18、的关系模式:商品类别 ( 商品类别号,商品类别 ) 此为联系“购物车”所对应的关系模式:购物车 ( 购物车号,客户号,商品号,, ) 此为联系“订单”所对应的关系模式:订单 ( 订单号,客户号,商品号,, )此为联系“评论”所对应的关系模式:评论 ( 评论号,内容,客户号,, )此为联系“供应”所对应的关系模式:供应 ( 供应号,实际存货,最少存货,, )4.3 所有关系表达到 BCNF范式4.4 定义视图( 1)订单表中只关联客户、商品的 ID,而最终客户核对的应该是包含客户真实姓名在内的客户必要信息以及包含商品名称的商品信息, 分别建立两个视图:1 参照商品的订单细节create view
19、 View_goods as select * from tb_goods where GoodsID=201201 2参照客户信息的订单细节create view View_user as select * from tb_user where UserID=201 4.5 定义索引在经常查询的列上(主键)建立聚簇索引如:在商品信息表上建立索引create cluster index Index_ GoodsID on tb_goods(GoodsID) 4.6 定义触发器( 1)注册客户自动升级 VIP -创建触发器 tr_grade,实现注册客户 VIP 自动升级Create Trigg
20、er tr_grade ON tb_sub For update As IF Update(SpPrice) Begin Declare price money Select price=SpPrice From inserted If price=30000 Update tb_user set GradeID=4 Else If price=20000 Update tb_user set GradeID=3 Else If price=10000 Update tb_user set GradeID=2 Else If price=0 Update tb_user set GradeID
21、=1 End ( 2)更新订单,订单金额是商品价格总和-创建一个更新触发器,及时更新订单Create Trigger tr_update On tb_sub For Update As If Update (SpCount) Or Update (GPrice) Begin Declare orderNo Bigint,productNo Bigint Declare cur_order Cursor For Select SubID,GoodsID From Deleted Open cur_order Begin Transaction Fetch cur_order into order
22、No,productNo While (fetch_status=0) Begin Update tb_sub Set tb_sub.SpPrice=tb_sub.SpPrice-D.SpCount*D.GPrice+I.SpCount*I.GPrice From inserted I,deleted D Where tb_sub.subID=I.subID And I.subID=D.subID And tb_sub.subID=orderNo And I.GoodsID=D.GoodsID And I.GoodsID=productNo Fetch cur_order into order
23、No,productNo End Commit tran Close cur_order Deallocate cur_order End ( 3)更新购物车,选中商品更新商品总额-更新购物车,选中商品更新商品总额Create Trigger tr_car On tb_car For Update As If Update (OrderCount) Or Update (GoodsPrice) Begin Declare CarID Bigint,GoodsID Bigint Declare cur_car Cursor For Select CarID,GoodsID From Delete
24、d Open cur_car Begin Transaction Fetch cur_car into CarID,GoodsID While (fetch_status=0) Begin Update tb_car Set tb_car.OrderPrice=tb_car.OrderPrice-D.OrderCount*D.GoodsPrice+I.OrderCount*I.GoodsPrice From inserted I,deleted D Where tb_car.CarID=I.CarID And I.CarID=D.CarID And tb_car.CarID=CarID And
25、 I.GoodsID=D.GoodsID And I.GoodsID=GoodsID Fetch cur_car into CarID,GoodsID End Commit tran Close cur_car Deallocate cur_car End ( 4)创建触发器只允许注册会员在网上下订单-创建一个触发器 tr_sub,只允许注册会员在网上提交订单Create Trigger tr_sub on tb_sub For insert As If Not Exists (select * From inserted Where UserID in(select tb_user.User
26、ID from tb_user) Begin Raiserror(提交订单前请先注册! ,16,1) Rollback Transaction End 4.7 定义约束( 1)确定实体完整性约束主键约束( 2)参照完整性约束-为 tb_user表添加参照性约束alter table tb_user with nocheck add constraint fk_user foreign key(GradeID) references tb_grade(GradeID) -为 tb_goods表添加参照性约束alter table tb_goods with nocheck add constra
27、int fk_goods foreign key(GTypeID) references tb_type(TypeID) -为 tb_address 增加外键约束alter table tb_address with nocheck add constraint fk_address foreign key(UserID) references tb_user(UserID) ( 3)用户自定义完整性约束1客户表密码不能少于 6 位,且不能与客户号相同Alter table tb_user Add constraint Ck_pass Check (6UserID) 2 电子信箱格式为 xxx
28、xxx.xxx 格式Alter table tb_user Add constraint Ck_email Check (Email like %qq.%) 3订单号共 12 位,前 8 位是订货日期,后 4 位是流水号,格式为“ 201312 150001”3 订货时间早于发货时间alter table tb_sub with nocheck add constraint ck_sub check(SpDate 发票号码唯一alter table tb_receipt add constraint un_receipt unique(ReceiptID) 6 订单状态取值为“ 0”或“ 1”
29、alter table tb_sub with nocheck add constraint ck_state check(State in (0,1) 7身份证号必须为 16 或者 18 位Alter table tb_user Add constraint Ck_id Check (ID in (16,18) 8,五、结束语一个软件最重要的不是前台页面,而是软件的生存期,即实用性的长远,而后者则主要取决于后台的维护。 维护离不开对数据库的操作, 所以数据库设计在软件开发过程中是基础也是非常重要的一个环节。 对于开发者而言, 好的数据库设计,可以避免功能需求的重大缺陷,如:访问数据库,查询的冗杂繁琐。数据库更新操作的错误异常等。 通过这次设计, 更让我深刻感受到, 打好基础的重要性, 当然也对数据库的了解加深一步。 尽管整个数据库设计做下来, 非常的艰辛,但从中学到的知识远比辛苦更加珍贵。 本次的设计也有很多不足之处, 数据表之间的关联,关系表的范式,以及一些有待解决的问题也随之而来。供应关系中,购买数大于世纪存货梁,应通知商家及时补货,这个流程还没有完善,等等。我会带着这些问题,在以后的设计中注意改善。六、参考文献1 王珊 , 萨师煊 . 数据库系统概论 M. 北京 : 高等教育出版社 ,2006.5