1 概述1.1课题简介书店书目书种繁多,来源多样,购买者众多,图书信息、供应商信息、客户信息、销售信息庞大,不易管理。
因此,很有必要创建一个小型书店管理系统,以便于书店对图书的管理。
1.2设计目的应用对数据库系统原理的理论学习,通过上机实践的方式将理论知识与实践更好的结合起来,巩固所学知识。
数据库应用课程实践:实践和巩固在课堂教学中学习有关知识,熟练掌握对于给定结构的数据库的创建、基本操作、程序系统的建立和调试以及系统评价。
数据库原理软件设计实践:实践和巩固在课堂教学中学习的关于关系数据库原理的有关知识和数据库系统的建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价的一般过程,为毕业设计打下基础。
1.3设计内容运用基于E-R 模型的数据库设计方法和关系规范化理论做指导完成从系统的分析到设计直至系统的最终实现,开发小型书店管理系统,完成小型书店管理系统的全部功能。
首先做好需求分析,并完成数据流图和数据字典。
其次做概念分析,利用实体联系的方法将需求分析的用户需求抽象为信息结构,得到E-R 图。
然后就是逻辑结构设计,将E-R 图转换为计算机系统所支持的逻辑模型2 需求分析2.1功能分析首先,建立一些基本表(尽可能满足3N),对大部分基本信息组合、存储;其次通过建立视图实现对冗余数据的有必要保留(查询并计算基本表属性得到新的作为视图属性)并实现对以下基本信息的显示。
图书信息:图书名称、订购数量、订购时间、订购单价、金额、出版社名称、作者名称;供应商名称等;供应商信息:供应商名称、地址、电话,联系人;客户信息:客户编号、名称、年龄、性别、累计购书金额等;销售信息:时间、销售名称、数量、销售单价、客户编号、客户名称、金额等。
在此基础上进行以下目标查询,由于有些查询常用且较复杂,为了简化其应用,所以将它们定义为存储过程。
查询当月书店销售金额、营业金额;(存储过程)查询某种图书库存数量;(存储过程)查询当月销量最好的图书信息;(存储过程)按供应商名称查询订购信息;(普通查询)查询购买次数超过3次的客户信息。
(普通查询)接着根据需要建立触发器、存储过程、索引,实现对数据库的优化。
最后,进行过程功能的验证。
允许具有权限者对数据库进行数据更新和查询等合法操作。
数据流图用流程图来描述处理过程与数据的关系数据流图如下:图书目录文购买信息文出版社档案文件用户购买信息图书需求用户供应商供应信息图书供应供应商信息处理信息处理顾客购书档案文件购买供应汇总文件图2,1 数据流图数据字典用数据字典来描述数据数据字典如下:数据项:表2.1 数据字典数据结构:概念结构设计概念结构设计的方法自顶向下,自底向上,逐渐扩张以及混合策略。
本系统设计概念结构通常有四类方法:根据自顶向即首先定义全局的概念结构的框架,然后逐步细化。
采用的是自底向上的方法。
下地进行需求分析然后再自底向上地进行概念设计。
概念结构设计的步骤第一步:抽象数据;E-R图;第二步:设计局部图,消除各种冲突;E-R图综合成总体E-R第三步:把各分图进行优化,消除冗余数据和冗余联系;第四步:对总体E-R抽象初步数据:(此处与优化后E-R图得出的实体联系属性很有可能不同)实体:图书、供应商、客户联系:图书订购关系、图书销售关系图书与供应商的关系是多对一的关系;图书与客户的关系是多对一的关系。
属性:图书的属性:图书编号、图书名称、出版社名称、作者名称、供应商名称;主码为图书编号供应商的属性:供应商名称、供应商地址、电话、联系人;主码为供应商名称客户的属性:客户编号、姓名、性别、年龄;主码为客户编号图书订购关系属性:供应商名称、图书编号、订购时间、订购单价;主码为供应商名称和图书编号图书销售关系属性:客户编号、图书编号、销售时间、销售单价;主码为客户编号和图书编号分E-R图:图书E-R图:图书编号图书名称出版社名称图书作者名称供应商名称供应商E-R图:供应商名称供应商地址供应商电话联系人E-R客户图:年龄初E-R图:供应商名客户编图书编销售时销售单客客户编性姓名优化后的总E-R图:逻辑设计阶段逻辑设计阶段:将系统E-R模型转换为关系模式,并对给出的关系模式进行关系规范化处理(尽量满足3NF),得到系统全部的关系模式,并标明主键、外键此部分一律采用英文命名。
然后进行用户外模式的设计,针对中国用户,此处用中文命名。
将E——R模式转换为以下关系模式:1) book(#bname, writer_name, press_name);主键:#bname2.) everybook (# bno, #bname) ;主键:#bno外键:#bname3) supplier (#supplier_name, address, telephone, contact) ;主键:#supplier_name4) customer (#cno, cname, sex, age);主键:#cno5) book_order(#bname, #supplier_name, #order_time, order_price, order_count);主键: #bname, #supplier_name, #order_time6) book_sell(#bno, #cno, sell_time, sell_price);主键:#bno发现这六个关系模式3N都满足。
因为元组中都是不可分割的数据,且所有非主属性完全依赖其主码,且它的任何一个非主属性都不传递于任何主关键字。
用户外模式设计:基本信息视图的建立:1. 单本销售情况(图书编号,图书名称客户编号,客户名称,销售单价,销售时间);2. 同种销售情况(书名,销售数量,销售金额);3. 客户信息(客户编号,客户名称、性别,年龄,累计购书金额);4. 供应商信息(供应商名称,地址,电话,联系人);5. 图书订购信息(图书名称,供应商名称,订购时间,订购数量,订购单价,订购金额,出版社名称,作者名称);物理设计阶段物理设计阶段:为一个逻辑数据模型选取一个最适合应用环境的物理结构(存储结构与存取方法),数据库的物理设计通常分为两步:A、确定数据库的物理结构;B、对物理结构进行时间和空间效率评价。
建立小型书店管理系统创建数据库 book_shop_management--创建小型书店管理系统create database book_shop_managementon primary(name='book_shop_management',filename='d:\program files\microsoft sql server\mssql.1\mssql\data\book_shop_management.mdf',size=10mb,maxsize=unlimited,filegrowth=10%)log on(name='book_shop_management_log',filename='d:\program files\microsoft sqlserver\mssql.1\mssql\data\book_shop_management_log.ldf',size=1mb,maxsize=5mb,filegrowth=3%)go截图得:对各个基本表的建立(包括了各种完整性约束)建立表 book--建立表bookcreate table book(#bname varchar(30)primary key,writer_name char(8),press_name char(12))建立表 everybook--建立表everybookcreate table everybook(#bno char(8)primary key,#bname varchar(30)not nullconstraint fk_everybook_bname foreign key references book(#bname))建立表 supplier--建立表suppliercreate table supplier(#supplier_name char(12)primary key,address varchar(50)not null,telephone char(7)not null,null))not contact char(8建立表 customer--建立表customercreate table customer(#cno char(8)primary key,cname char(8)not null,sex char(2),age int,)))女'','' ck_customer_sex check(sex in(男constraint建立表 book_order --建立表book_ordercreate table book_order(#bname varchar(30),#supplier_name char(12),#order_time datetime,order_count int not null,order_price int not null,)),#order_time#bname,#supplier_name keyconstraint pk_book_order primary(建立表book_sell--建立表book_sellcreate table book_sell(#bno char(8)primary key,#cno char(8)not null,sell_time datetime,sell_price int)建立视图建立基本信息视图:建立单本销售情况视图--建立单本销售情况视图create view view_单本销售情况asselect book_sell.#bno as图书编号,#bname as图书名称, book_sell.#cno as客户编号,cname as客户名称,sell_time as销售时间,sell_price as销售单价from book_sell,customer,everybookwhere everybook.#bno=book_sell.#bnoand customer.#cno=book_sell.#cno建立同种销售情况视图--建立同种销售情况视图create view view_同种销售情况asselect图书名称as书名,count(图书编号)as销售数量,sum(销售单价)as销售金额from view_单本销售情况图书名称by group建立客户信息视图--建立客户信息情况create view view_客户信息select customer.#cno as客户编号,cname as客户名称,sex as性别,age as年龄,(select sum(sell_price)from book_sellgroup by #cno)as累计购书金额from book_sell,customerwhere book_sell.#cno=customer.#cno建立供应商视图--建立供应商视图create view view_供应商信息asselect #supplier_name as供应商名称,address as地址,telephone as电话,contact as联系人supplier from建立订购信息视图--建立订购信息视图create view view_图书订购信息asselect book_order.#bname as图书名称,#supplier_name as供应商名称,#order_time as订购时间,order_price as订购单价,order_count as订购数量,(order_price*order_count)as订购金额,press_name as出版社名称,writer_name as作者名称from book,book_order#bnamebook_order. book.#bname=where建立存储过程某种图书库存查询存储过程create procedure sp_某种图书库存查询--@p1为要查询的图书名称@p1 varchar(30)asbeginselect订购数-销售数量as库存from(select sum(order_count)as订购数,#bname as书名from book_ordergroup by #bname)as x,view_同种销售情况where x.书名=@p1 and view_同种销售情况.书名=@p1endgo某段时间内的销售业绩查询存储过程----建立本月业绩查询存储过程-----由于不知其它信息,此处将销售金额与营业金额等同-----营业金额=营业额=成本+利润create procedure sp_查询某段时间内的业绩--@p1为起始时间,@p2为结束时间@p1 datetime,@p2 datetimeasbeginselect sum(销售单价)as销售金额from view_单本销售情况where销售时间>=@p1 and销售时间<=@p2endgo某段时间内的销售最好图书信息查询存储过程----建立某段时间内销售最好图书信息查询存储过程create procedure sp_查询某段时间内销售最好的图书信息@p1 datetime,@p2 datetimeasbeginselect #bname as图书名称,writer_name as作者名称,press_name as出版社名称from(select图书名称as书名,count(图书编号)as销售数量from view_单本销售情况where销售时间>=@p1and销售时间<=@p2group by图书名称)as x,bookwhere #bname=书名and销售数量>=all(select count(图书编号)from view_单本销售情况where销售时间>=@p1and销售时间<=@p2group by图书名称)endgo建立触发器(另外5个表也建立相应曾删改触发器,不过此处从略,详情见附件源代码)建立一个customer的操作审核表,并建立相关触发器,当向customer中插入、更新或删除记录时,生成一条操作记录插入到该操作审核表中,内容包括客户编号、客户名称、操作方式(插入/更新/删除)和操作时间----建一个操作审核表create table customer_operate(客户编号char(8)not null,客户名称char(8)not null,操作方式char(4)not null,操作时间datetime not null)----建立相关触发器create trigger trigger_customer_inserton customerfor insertasbegindeclare @p1 char(8),@p2 char(8)set @p1=(select #cno from inserted)set @p2=(select cname from inserted)print'insert:'select*from insertedinsert into customer_operate values(@p1,@p2,'插入',getdate())endgocreate trigger trigger_customer_deleteon customerfor deleteasbegindeclare @p1 char(8),@p2 char(8)set @p1=(select #cno from deleted)set @p2=(select cname from deleted)print'deleted:'select*from deletedinsert into customer_operate values(@p1,@p2,'删除',getdate())endgocreate trigger trigger_customer_updateon customerfor updateasbegindeclare @p1 char(8),@p2 char(8)set @p1=(select #cno from deleted)set @p2=(select cname from deleted)print'inserted:'select*from insertedprint'deleted:'select*from deletedinsert into customer_operate values(@p1,@p2,'修改',getdate())endgo建立索引(由于数据库比较小,没有必要建立索引)实现数据库(有附件源代码和该数据库源文件)过程功能验证向基本表插入适量如下数据并显示基本表信息everybook book#bname#bno#bname Writer_name Press_name何以笙箫默00000001顾漫晋江出版社何以笙箫默何以笙箫默00000002起点出版社辛夷坞原来你还在这里00000003原来你还在这里烈火如歌晋江出版社明晓溪烈火如歌00000004阅读出版社微微一笑很倾城顾漫烈火如歌0000000500000006烈火如歌00000007微微一笑很倾城book_sell#cno Sell_time#bno Sell_price000000012013-6-16000000012100000002000000032013-6-25190000000200000007202013-7-900000003000000042013-7-923 00000004000000052013-7-1918customercnamesex#cno Age女0000000118吕鹏00000002女孙鲁鲁18女王肖雨0000000319邵丽君00000004女19Book_orderOrder_time#supplier_name#bnameOrder_countOrder_price大旗212何以笙箫默2013-6-1010大旗2013-6-20原来你还在这里1102013-7-2红方1烈火如歌2013-7-3烈火如歌长城291112013-7-3高原微微一笑很倾城Suppilier contact telephone#suppiler address上海王平大旗1573234上海李景红方1734272 1564323长城张艳丽江苏殷风高原郑州1242356在注:此处插入数据应当bookeverybook 之前插入数据(外键)截图得:视图显示基本信息---用显示视图基本信息select*from view_单本销售情况select*from view_供应商信息select*from view_客户信息select*from view_同种销售信息图书订购信息 view_from*select截图得:执行存储过程完成目标查询某种图书库存查询'某种图书库存查询sp_'烈火如歌exec本月业绩查询'2013-7-31', sp_exec查询某段时间内的业绩'2013-7-1'本月销售最好图书信息查询,查询某段时间内销售最好的图书信息execsp_'2013-7-1''2013-7-31'截图得:用普通查询完成目标查询(两次查询同时显示)订购超3次客户信息查询---订购超次客户信息查询select*from view_客户信息where客户编号=any(select #cno from book_sellgroup by #cno)(*)>3having count按供应商名称查询订购信息---按供应商名称查询订购信息select*from view_图书订购信息order by供应商名称截图得:注:数据检查得,确实没有订购超3次的客户。