数据库课程设计——网上书店.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date数据库课程设计网上书店实验八附页完成内容模板数据库原理与应用 2011 / 2012 学年 第 1 学期实验八 数据库设计姓 名:_ _学 号:_ _班 级:_ _指导教师:_ _计算机科学与工程学院一、系统需求分析1.1 系统要求(1)提供了全面,详细的图书购物入口,轻松实现快捷购买。 (2)可以通过不同分类进行导航,用最方便,最快捷的方式找到你需要的图书。(3)提供了图书购物所需的各种工具与网站,满足你的图书购买需求。(4)公正性很强 (大站.专站.小站)排列顺序分明.公平公正的图书网址TOP排行1.2 需求分析(主要完成功能分析,建立功能模块图)网上书店和现实书店区别比较:网上书店 优势:涉及范围广,经营成本低。 劣势:信用度如果低,影响生意;现实书店 优势:直观,信用度高。 劣势:涉及范围有限,经营成本高;现在有部分现实书店已经开始从网上书店进货了。本系统开发的目的是为了学习这样去做一个交互式的网页以及了解这种强大的网络编程工具,方便客户端和浏览器端之间的交流。数据库采用实用,易学的SQL Sever 2000,以Tomcat作为JSP的WEB服务器,XP作为系统运行平台。功能模块图:二、概念结构设计根据需求分析,作出概念结构设计的E-R图如下:管理员信息的E-R图:客户信息的E-R图:图书信息的E-R图:实体之间关系的E-R图:三、逻辑结构设计3.1 E-R图转换为关系模型Books(图书信息):该表记录了图书的相关信息,包括(bookid, bookname, author, pubdate, pubhouse, type, cover, price, salenum)。Order(订单信息):该表记录了订单的相关信息,包括(adminid, orderid, userid, username, bookid, orderdate, orderstate)。User (客户信息):该表记录了客户的相关信息:包括(userid, username, password, sex, age, phone, email, address, post)。订单信息视图(View_Order)包括(userid, adminid, bookid, orderdate, orderstate, price, salenum, username, phone, email, address, post)。3.2 数据库表的基本结构(用表格方式表示,参照实验2中给出的表的基本结构说明)根据逻辑结构设计,设计相应的表结构如下所示:图书表(Books),结构如下所示:列名说明数据类型约束bookid书号CHAR(6)PRIMARY KEYbookname书名VRCHAR(50)NOT NULLauthor作者VRCHAR(50)NOT NULLpubdate出版日期datetimeNOT NULLpubhouse出版社VRCHAR(50)NOT NULLtype类型VRCHAR(50)NOT NULLcover封面VRCHAR(50)NOT NULLprice价格SMALLINT大于0salenum 销售数量SMALLINTDEFAULT 100订单表(Order),结构如下所示:列名说明数据类型约束adminid管理员号CHAR(6)NOT NULLorderid订单号CHAR(6)NOT NULLuserid客户号CHAR(6)主码,引用User的外码username客户名VARCHAR(50)NOT NULLbookid书号CHAR(6)主码,引用Books外码orderdate订单日期datatimeNOT NULLorderstate订单状态VARCHAR(50)NOT NULL客户表(User),结构如下所示:列名说明数据类型约束userid客户号CHAR(6)主码username客户名VARCHAR(50)NOT NULLpassword密码SMALLINT大于0sex性别CHAR(2)取“男”或“女”age年龄SMALLINT大于0phone电话号码SMALLINT 大于0email邮箱地址VARCHAR(50)NOT NULLaddress住址VARCHAR(50)NOT NULLpost邮编SMALLINT大于0根据以上分析,建立视图把相关隐秘信息保护起来,设置一定的权限,让管理员便于管理客户,订单和图书,客户之间没有权限访问,避免数据的冲突,保持数据的完整性和一致性。四、SQL编程(主要包括创建表和创建必要的视图、触发器、存储过程等)建立图书表(Books):CREATE TABLE Books(Bookid char(6)PRIMARY KEY,Bookname varchar(50)not null,Author varchar(50) not null,Pubdate datetime not null,Pubhouse varchar(50) not null, Type varchar(50) not null, Cover varchar(50) not null, Price smallint check(price>0), Salenum smallint default 100,)建立订单表(Order):CREATE TABLE Order(Adminid char(6)not null,Orderid char(6)not null,Userid char(6) ,Username varchar(50) not null, Bookid char(6) , Orderdate datetime not null, Orderstate varchar(50) not null,PRIMARY KEY (Userid,Bookid),FOREIGN KEY (Userid) REFERENCES User(Userid),FOREIGN KEY (Bookid) REFERENCES Books(Bookid)建立客户表(User):CREATE TABLE User(Userid char(6)PRIMARY KEY,Username varchar(50)not null,Password smallint check(password>0),Sex char(2) check(Sex='男' or Sex='女'),Age smallint check(age>0),Phone smallint check(phone>0), Email varchar(50) not null,Address varchar(50) not null,Post smallint check(post>0),)建立订单信息视图(View_Order):CREATE VIEW View_OrderASSELECT * FROM User,Books,Order WHERE Books.bookid=Order.bookid User.userid=Order.userid User.username=Order.usernameORDER BY User.userid ASCGRANT ALL PRIVILIGES ON User,Books,OrderTO AdminidWITH GRANT OPTIONAND GRANT ALL PRIVILIGES ON Order,UserTO Userid;建立触发器:CREATE TRIGGER Update_Userid AFTER UPDATE ON UserFOR EACH ROWAS BEGINIF(new.Userid<>old.Userid) THEN INSERT INTO User VALUES( new.Userid,newUsername,new.Password,CURRENT_USER,CURRENT_TIMESTAMP);END IF;END;建立一个名为“check_user”的存储过程:create procedure check_user Orderid char(6), Usertype char(6), Userid varchar(50), Adminid varchar(50), Price smallint output, Salenum smallint output, Orderid char(6), Username varchar(50), Password smallint outputas begin if Usertype=Adminid -如果是管理员begin if exists (select Adminidfrom Orderwhere Adminid=Adminid) return 1else return 0 end else if Usertype=Userid -如果是客户begin if not exists(select Useridfrom Userwhere Userid =Userid ) elsebegin if (select Userid User where Userid is null)return 0 elsebegininsert into User(Userid,Username,Password) values(Userid,Username,Password)return 1select order from Order,Books,Userwhere Books.bookid=Order.bookid User.userid=Order.userid User.username=Order.usernameif(Orderid is null)return Orderidelse set Orderid=-1return Orderid end end执行存储过程:declare i intexec i=check_user 'N02','N03'print ideclare Order smallintexec Orderid '001',Order outputprint Order五、设计小结(本次设计小结,存在的问题,收获等) 通过这次课程设计我对数据库的编程语言有了深刻的了解,对SQL语言的简洁性和高效性有了自己进一步的体会,同时对数据库的一些设计模式也有了一个大致的认识与了解。 在整个程序的设计过程中,对软件编程的流程,包括需求分析、概要设计、详细设计等步骤又有了一个新的认识,尤其是需求分析的好坏在整个程序的设计中有着举足轻重的作用。需求分析没有做好,后面的步骤很容易受到负面的影响。-