网上购物数据库设计(共15页).doc
精选优质文档-倾情为你奉上一、概述1.1需求背景伴着电子时代的迅猛发展和人民物质生活的水平的提高,越来越多的电子购物浪潮也汹涌而来。我们容身在这个信息化的大时代,网购也就成了许多人生活中必不可少的一部分,足不出户的便捷式购物与传统的购物方式大相径庭,人们在享受到方便、实惠的同时也不必担忧安全的问题,既方便了自身也推动着国家经济的发展。电子商务网络购物平台,无疑是这个时代的进步。1.2编写目的数据库设计说明书是数据库设计的必要部分,对设计中的数据库的所有标识、逻辑结构和物理结构作出具体的设计规定。本数据库的设计说明书编写的目的是对网上购物系统设计的说明,明确系统中的各项功能与非功能的需求,从而做出系统的数据流图以及实体联系图。作为系统的基准文档,为以后的开发和维护提供依据。1.3软件定义Myeclipse 10.0:一个非常优秀的用于开发Java、J2EE的Eclipse插件集合,Myeclipse功能非常强大,支持也十分广泛,尤其对各种开源产品的支持也不错。Apache Tomcat 6.0:是一个开放源代码、运行servlet和JSP Web应用软件容器。Microsoft SQL Server 2005:Structured Query Language1.4开发环境本电子商务网络购物平台的开发环境是Windows 7、Myeclipse10.0、Apache Tomcat6.0,数据库环境是Microsoft SQL Server 2005。二、需求分析2.1问题陈述设计网络购物系统的数据库。2.1需完成的功能客户功能:(1) 游客可以查看商品信息,浏览网站信息,经过注册可以成为注册客户。(2) 注册客户:注册、客户信息查看和修改。客户登录、确认客户信息,显示客户信息。商品信息浏览、购物车管理、商品查找、订单查询以及商品评论。结账、确认订单、订单状态查询、历史订单查询。商家功能:商品的增删改。订单处理、订单配送。客户注册后,登录到电子商务网站,进入购物流程。客户在浏览所有商品信息后,可以查看每个商品的详细信息,选择购买或加入购物车,购物车内可以随意增删商品,修改商品数量,并同时统计购物车内商品总额。客户确认购物车内的商品,选中购买,即可生成订单。可以查看订单状态,“0表示”商品未发出,“1”表示商品已发出。客户分为普通客户和VIP客户,依据购买商品的金额和数量,自动升级。不同的VIP等级享有不同的折扣。2.1数据流图网络购物系统总数据流图如下图1:网络购物系统总数据流图2.1数据字典客户表数据字典:字段中文描述数据类型是否为空备注UserID客户IDBigIntNot null主键UserName客户名Varchar(30)Not nullRealName客户真实姓名Varchar(30)Not nullUserPassword客户密码Varchar(30)Not nullEmail客户邮箱Varchar(30)Not nullPhone联系电话Varchar(30)Not nullID身份证号Varchar(30)Not nullQuestion密码问题Varchar(30)NullResult答案Varchar(30)NullRegTime注册时间DatetimeNot nullGradeID会员等级BigIntNot nullAddressID地址IntNot null表1:客户表字段信息商品表数据字典:字段中文描述数据类型是否为空备注GoodsID商品号BigIntNot null主键GName商品名称Varchar(30)Not nullGPrice商品价格SmallmoneyNot nullGTypeID商品类别BigIntNot nullGIntro商品描述Varchar(200)NullGImage商品图片路径Varchar(100)NullGCount商品计数IntNot nullGSail商品销量BigIntNot nullGWeight商品重量BigIntNullGDateTime上架日期DatetimeNot nullGSize商品规格Varchar(100)Not null表2:商品表字段信息商品类别表数据字典:字段中文描述数据类型是否为空备注TypeID商品类别号BigIntNot null主键TypeName类别描述Varchar(50)Not null表3:商品类别表字段信息商家表数据字典:字段中文描述数据类型是否为空备注ProducerID商家号BigIntNot null主键ProName商家名Varchar(30)Not nullProAddress商家地址Varchar(50)Not nullProPhone商家电话Varchar(30)Not null表4:商家表字段信息订单表数据字典:字段中文描述数据类型是否为空备注SubID订单号Varchar(30)Not null主键UserID客户号BigIntNot nullGoodsID商品号BigIntNot nullRAddress送货地址Varchar(50)Not nullSpDate订购日期DatetimeNot nullSpCount订购数量IntNot nullGPrice单价SmallmoneyNot nullReceiptID发票号BigIntNot nullSpPrice订单金额MoneyNot nullSendDate发货时间DatetimeNot nullPayment付款方式Varchar(20)Not nullSendType运送方式Varchar(20)Not nullSendPrice邮费SmallmoneyNot nullState订单状态IntNot null表5:订单表字段信息购物车表数据字典:字段中文描述数据类型是否为空备注CarID购物车IDBigIntNot null主键UserID客户IDVarchar(10)Not nullGoodsID商品IDVarchar(20)Not nullOrderTime订购时间DatetimeNot nullOrderCount订购数量IntNot nullGoodsPrice单价SmallmoneyNot nullUserCheck用户确认IntNot nullOrderPrice购物总额MoneyNot null表6:购物车表字段信息会员等级表数据字典:字段中文描述数据类型是否为空备注GradeID会员等级IDBigIntNot null主键GradeType等级分类IntNot null表7:会员等级表字段信息评论表数据字典:字段中文描述数据类型是否为空备注CommentID评论IDBigIntNot null主键Content1内容Varchar(200)Not nullTitle标题Varchar(20)Not nullUserID客户IDBigIntNot nullProducerID商家IDBigIntNot nullCommentTime评论时间DatetimeNot null表8:评论表字段信息供应表数据字典:字段中文描述数据类型是否为空备注SupplyID供应IDBigIntNot null主键RealStock实际存货IntNot nullMinStock最低存货IntNot nullGoodsID商品IDBigIntNot nullProducerID商家IDBigIntNot null表9:供应表字段信息发票表数据字典:字段中文描述数据类型是否为空备注ReceiptID发票IDBigIntNot null主键SubID订单号BigIntNot null表10:发票表字段信息地址表数据字典:字段中文描述数据类型是否为空备注AddressID地址IDIntNot null主键Address地址Varchar(50)Not nullUserID客户IDBigIntNot null表11:发票表字段信息三、数据库概念结构设计3.1 E-R模型图的设计(1)寻找实体集客户VIP会员商品商家商品类别地址(2)寻找实体间联系客户与商品之间多对多联系:订单,评论1> 客户与VIP会员之间多对一联系:属于2> 会员等级与订单细节一对多:参照13> 订单细节与商品多对一:参照24> 订单细节预订单多对一:组成客户与商品之间一对多联系:购物车1> 客户与购物车一对一:拥有2> 购物车与商品一对多:存放3> 购物车与订单细节一对多:结算商家与商品之间多对多联系:供应商品与商品类别之间多对一联系:分类客户与地址之间一对多联系:所在(3)确定实体的属性客户:客户ID 客户名 客户真实姓名 客户密码 客户邮箱 联系电话身份证号 密码问题 答案 注册时间 会员等级IDVIP会员:会员等级ID 等级分类商品:商品号 商品名称 商品价格 商品类别 商品描述 商品图片路径 商品计数 商品销量 商品重量 上架日期 商品规格商家:商家号 商家名 商家地址 商家电话地址:地址号 地址名称商品类别:商品类别号 类别描述(3)确定联系的属性订单:订单号 客户号 商品号 送货地址 订购日期 订购数量 单价发票号 订单金额 发货时间 付款方式 运送方式 邮费 订单状态购物车:购物车ID 客户ID 商品ID 订购时间 订购数量 单价 用户确认供应:供应ID 实际存货 最低存货 商品ID 商家ID分类:商品号 商品分类客户类型属于:客户号 客户类型评论:评论ID 内容 标题 客户ID 商家ID 评论时间客户地址所在:客户号 客户地址(4)画出E-R图图2:客户与商品实体间的详细联系E-R图图3:网络购物系统E-R图四、数据库逻辑结构设计4.1 E-R模型图转化为关系表(1)实体转化为单独的一张表客户VIP会员商品商家商品类别地址(2)多对多联系转化为单独的一张关系表购物车 订单 评论 供应(3)其他一对多的联系通过在多的一方增加属性来实现客户表与会员等级:在客户表中增加会员等级ID商品与商品类型:在商品中增加类型号4.2 描述基本表的关系E-R图转化为关系模型,关系的码用下划线标出。此为客户实体对应的关系模式:客户(客户号,密码,会员等级号,)此为VIP会员实体对应的关系模式:VIP会员(会员等级号,等级类型)此为商品实体对应的关系模式:商品(商品号,描述,商品分类,商品名,)此为商家实体对应的关系模式:商家(商家号,商家名,商家电话,)此为商品类别实体对应的关系模式:商品类别(商品类别号,商品类别)此为联系“购物车”所对应的关系模式:购物车(购物车号,客户号,商品号,)此为联系“订单”所对应的关系模式:订单(订单号,客户号,商品号,)此为联系“评论”所对应的关系模式:评论(评论号,内容,客户号,)此为联系“供应”所对应的关系模式:供应(供应号,实际存货,最少存货,)4.3 所有关系表达到BCNF范式4.4 定义视图(1)订单表中只关联客户、商品的ID,而最终客户核对的应该是包含客户真实姓名在内的客户必要信息以及包含商品名称的商品信息,分别建立两个视图:1> 参照商品的订单细节create view View_goodsas select * from tb_goods where GoodsID=''2>参照客户信息的订单细节create view View_useras select * from tb_user where UserID='201'4.5 定义索引在经常查询的列上(主键)建立聚簇索引如:在商品信息表上建立索引create cluster index Index_ GoodsIDon tb_goods(GoodsID)4.6 定义触发器(1)注册客户自动升级VIP-创建触发器tr_grade,实现注册客户VIP自动升级Create Trigger tr_grade ON tb_subFor updateAsIF Update(SpPrice)BeginDeclare price moneySelect price=SpPrice From insertedIf price>=30000Update tb_user set GradeID=4ElseIf price>=20000Update tb_user set GradeID=3ElseIf price>=10000Update tb_user set GradeID=2ElseIf price>=0Update tb_user set GradeID=1End(2)更新订单,订单金额是商品价格总和-创建一个更新触发器,及时更新订单Create Trigger tr_update On tb_sub For Update AsIf Update (SpCount) Or Update (GPrice)Begin Declare orderNo Bigint,productNo BigintDeclare cur_order Cursor ForSelect SubID,GoodsID From DeletedOpen cur_orderBegin Transaction Fetch cur_order into orderNo,productNoWhile (fetch_status=0)Begin Update tb_subSet tb_sub.SpPrice=tb_sub.SpPrice-D.SpCount*D.GPrice+I.SpCount*I.GPriceFrom inserted I,deleted DWhere tb_sub.subID=I.subID And I.subID=D.subIDAnd tb_sub.subID=orderNo And I.GoodsID=D.GoodsIDAnd I.GoodsID=productNoFetch cur_order into orderNo,productNoEndCommit tranClose cur_orderDeallocate cur_orderEnd(3)更新购物车,选中商品更新商品总额-更新购物车,选中商品更新商品总额Create Trigger tr_car On tb_car For Update AsIf Update (OrderCount) Or Update (GoodsPrice)Begin Declare CarID Bigint,GoodsID BigintDeclare cur_car Cursor ForSelect CarID,GoodsID From DeletedOpen cur_carBegin Transaction Fetch cur_car into CarID,GoodsIDWhile (fetch_status=0)Begin Update tb_carSet tb_car.OrderPrice=tb_car.OrderPrice-D.OrderCount*D.GoodsPrice+I.OrderCount*I.GoodsPriceFrom inserted I,deleted DWhere tb_car.CarID=I.CarID And I.CarID=D.CarIDAnd tb_car.CarID=CarID And I.GoodsID=D.GoodsIDAnd I.GoodsID=GoodsIDFetch cur_car into CarID,GoodsIDEndCommit tranClose cur_carDeallocate cur_carEnd(4)创建触发器只允许注册会员在网上下订单-创建一个触发器tr_sub,只允许注册会员在网上提交订单Create Trigger tr_sub on tb_subFor insertAsIf Not Exists(select * From insertedWhere UserID in(select tb_user.UserID from tb_user)BeginRaiserror('提交订单前请先注册!',16,1)Rollback TransactionEnd4.7 定义约束(1)确定实体完整性约束主键约束(2)参照完整性约束-为tb_user表添加参照性约束alter table tb_userwith nocheckadd constraint fk_user foreign key(GradeID)references tb_grade(GradeID)-为tb_goods表添加参照性约束alter table tb_goodswith nocheckadd constraint fk_goods foreign key(GTypeID)references tb_type(TypeID)-为tb_address增加外键约束alter table tb_addresswith nocheckadd constraint fk_address foreign key(UserID)references tb_user(UserID)(3)用户自定义完整性约束1>客户表密码不能少于6位,且不能与客户号相同Alter table tb_userAdd constraint Ck_pass Check (6<=len(Userpassword) and Userpassword<>UserID)2> 电子信箱格式为格式Alter table tb_userAdd constraint Ck_email Check (Email like '%qq.%')3>订单号共12位,前8位是订货日期,后4位是流水号,格式为“”3> 订货时间早于发货时间alter table tb_subwith nocheckadd constraint ck_sub check(SpDate<SendDate)5> 发票号码唯一alter table tb_receiptadd constraint un_receipt unique(ReceiptID)6> 订单状态取值为“0”或“1”alter table tb_subwith nocheckadd constraint ck_state check(State in (0,1)7>身份证号必须为16或者18位Alter table tb_userAdd constraint Ck_id Check (ID in (16,18)8>五、结束语一个软件最重要的不是前台页面,而是软件的生存期,即实用性的长远,而后者则主要取决于后台的维护。维护离不开对数据库的操作,所以数据库设计在软件开发过程中是基础也是非常重要的一个环节。对于开发者而言,好的数据库设计,可以避免功能需求的重大缺陷,如:访问数据库,查询的冗杂繁琐。数据库更新操作的错误异常等。通过这次设计,更让我深刻感受到,打好基础的重要性,当然也对数据库的了解加深一步。尽管整个数据库设计做下来,非常的艰辛,但从中学到的知识远比辛苦更加珍贵。本次的设计也有很多不足之处,数据表之间的关联,关系表的范式,以及一些有待解决的问题也随之而来。供应关系中,购买数大于世纪存货梁,应通知商家及时补货,这个流程还没有完善,等等。我会带着这些问题,在以后的设计中注意改善。六、参考文献1 王珊,萨师煊.数据库系统概论M.北京:高等教育出版社,2006.5专心-专注-专业