《SQLserver数据库》课程设计范例
1 概述
1、1课题简介
书店书目书种繁多,来源多样,购买者众多,图书信息、供应商信息、客户信息、销售信息庞大,不易管理。因此,很有必要创建一个小型书店管理系统,以便于书店对图书得管理。
1、2设计目得
应用对数据库系统原理得理论学习,通过上机实践得方式将理论知识与实践更好得结合起来,巩固所学知识。
数据库应用课程实践:实践与巩固在课堂教学中学习有关知识,熟练掌握对于给定结构得数据库得创建、基本操作、程序系统得建立与调试以及系统评价。
数据库原理软件设计实践:实践与巩固在课堂教学中学习得关于关系数据库原理得有关知识与数据库系统得建立方法,熟练掌握对于给定实际问题,为了建立一个关系数据库信息管理系统,必须得经过系统调研、需求分析、概念设计、逻辑设计、物理设计、系统调试、维护以及系统评价得一般过程,为毕业设计打下基础。
1、3设计内容
运用基于E—R模型得数据库设计方法与关系规范化理论做指导完成从系统得分析到设计直至系统得最终实现,开发小型书店管理系统,完成小型书店管理系统得全部功能.
首先做好需求分析,并完成数据流图与数据字典。
其次做概念分析,利用实体联系得方法将需求分析得用户需求抽象为信息结构,得到E-R图。
然后就就是逻辑结构设计,将E-R 图转换为计算机系统所支持得逻辑模型
2 需求分析
2、1功能分析
首先,建立一些基本表(尽可能满足3N),对大部分基本信息组合、存储;其次通过建立视图实现对冗余数据得有必要保留(查询并计算基本表属性得到新得作为视图属性)并实现对以下基本信息得显示。
图书信息:图书名称、订购数量、订购时间、订购单价、金额、出版社名称、作者名称;供应商名称等;
供应商信息:供应商名称、地址、电话,联系人;
客户信息:客户编号、名称、年龄、性别、累计购书金额等;
销售信息:时间、销售名称、数量、销售单价、客户编号、客户名称、金额等。
在此基础上进行以下目标查询,由于有些查询常用且较复杂,为了简化其应用,所以将它们定义为存储过程。
查询当月书店销售金额、营业金额;(存储过程)
查询某种图书库存数量;(存储过程)
查询当月销量最好得图书信息;(存储过程)
按供应商名称查询订购信息;(普通查询)
查询购买次数超过3次得客户信息。(普通查询)
接着根据需要建立触发器、存储过程、索引,实现对数据库得优化。最后,进行过程功能得验证。允许具有权限者对数据库进行数据更新与查询等合法操作。
数据流图
用流程图来描述处理过程与数据得关系
数据流图如下:
图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);
?主键:#bname
2、)everybook (#bno, #bname);
主键:#bno
外键:#bname
3)supplier (#supplier_name, address,telephone,contact);
主键:#supplier_name
4)customer (#cno, cname, sex, age);
?主键:#cno
5)book_order(#bname, #supplier_name, #order_time, order_price,order_count);
?主键: #bname,#supplier_name,#order_time
6)?book_sell(#bno, #cno, sell_time, sell_price);
主键:#bno
发现这六个关系模式3N都满足.因为元组中都就是不可分割得数据,且所有非主属性完全依赖其主码,且它得任何一个非主属性都不传递于任何主关键字。
用户外模式设计:
基本信息视图得建立:
1、单本销售情况(图书编号,图书名称客户编号,客户名称,销售单价,销售时间);
2、同种销售情况(书名,销售数量,销售金额);
3、?客户信息(客户编号,客户名称、性别,年龄,累计购书金额);
4、?供应商信息(供应商名称,地址,电话,联系人);
5、图书订购信息(图书名称,供应商名称,订购时间,订购数量,订购单价,订购金额,出版
社名称,作者名称);
物理设计阶段
物理设计阶段:为一个逻辑数据模型选取一个最适合应用环境得物理结构(存储结构与存取方法),数据库得物理设计通常分为两步:A、确定数据库得物理结构;B、对物理结构进行时间与空间效率评价。
建立小型书店管理系统
创建数据库book_shop_management
——创建小型书店管理系统
createdatabase book_shop_management
on primary(
name=’book_shop_management’,
=’d:\program files\microsoft sql server\mssql、1\mssql\data\
book_shop_management、mdf’,
size=10mb,
maxsize=unlimited,
=10%)
log on(
name='book_shop_management_log’,
=’d:\program files\microsoft sqlserver\mssql、1\mssql\data\book_shop_management_log、ldf’,
size=1mb,
maxsize=5mb,
=3%)
go
截图得:
对各个基本表得建立(包括了各种完整性约束)
建立表book
—-建立表book
create tablebook(
#bnamevarchar(30)primary key,
writer_name char(8),
press_name char(12))
建立表everybook
—-建立表everybook
createtable everybook(
#bno char(8)primary key,
#bname varchar(30)notnull
constraint fk_everybook_bname foreignkey referencesbook(#bname))
建立表supplier
—-建立表supplier
createtable supplier(
#supplier_name char(12)primarykey,
address varchar(50)not null,
telephone char(7)not null,
contactchar(8)not null)
建立表customer
--建立表customer
create table customer(
#cnochar(8)primarykey,
cname char(8)not null,
sex char(2),
age int,
constraintck_customer_sex check(sex in(’男’,'女’)))
建立表book_order
-—建立表book_order
create table book_order(
#bname varchar(30),
#supplier_name char(12),
#order_time datetime,
order_count int not null,
order_priceintnot null,
constraint pk_book_orderprimary key(#bname,#supplier_name,#order_time))
建立表book_sell
—-建立表book_sell
createtable book_sell(
#bno char(8)primary key,
#cno char(8)not null,
sell_timedatetime,
sell_price int)
建立视图
建立基本信息视图:
建立单本销售情况视图
—-建立单本销售情况视图
createviewview_单本销售情况
as
select book_sell、#bno as图书编号,#bnameas图书名称, book_sell、#cnoas客户编号,cname as客户名称,
sell_timeas销售时间,sell_price as销售单价
from book_sell,customer,everybook
whereeverybook、#bno=book_sell、#bno
and customer、#cno=book_sell、#cno
建立同种销售情况视图
—-建立同种销售情况视图
create viewview_同种销售情况
as
select图书名称as书名,
count(图书编号)as销售数量,
sum(销售单价)as销售金额
from view_单本销售情况
group by图书名称
建立客户信息视图
--建立客户信息情况
createviewview_客户信息
select customer、#cnoas客户编号,
cname as客户名称,
sex as性别,
ageas年龄,
(select sum(sell_price)frombook_sell
groupby#cno)as累计购书金额
from book_sell,customer
where book_sell、#cno=customer、#cno
建立供应商视图
—-建立供应商视图
create viewview_供应商信息
as
select#supplier_name as供应商名称,
address as地址,
telephoneas电话,
contact as联系人
fromsupplier
建立订购信息视图
--建立订购信息视图
create view view_图书订购信息
as
selectbook_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作者名称
frombook,book_order
wherebook、#bname=book_order、#bname
建立存储过程
某种图书库存查询存储过程
create proceduresp_某种图书库存查询
-—p1为要查询得图书名称
p1varchar(30)
as
begin
select订购数-销售数量as库存
from(selectsum(order_count)as订购数,#bname as书名frombook_order
group by#bname)asx,view_同种销售情况
where x、书名=p1and view_同种销售情况、书名=p1
end
go
某段时间内得销售业绩查询存储过程
-—--建立本月业绩查询存储过程
-————由于不知其它信息,此处将销售金额与营业金额等同
——-—-营业金额=营业额=成本+利润
create proceduresp_查询某段时间内得业绩
-—p1为起始时间,p2为结束时间
p1 datetime,p2 datetime
as
begin
select sum(销售单价)as销售金额from view_单本销售情况
where销售时间〉=p1 and销售时间〈=p2
end
go
某段时间内得销售最好图书信息查询存储过程
-—--建立某段时间内销售最好图书信息查询存储过程
create procedure sp_查询某段时间内销售最好得图书信息
p1datetime,p2datetime
as
begin
select#bname as图书名称,
writer_name as作者名称,
press_name as出版社名称
from(select图书名称as书名,
count(图书编号)as销售数量
from view_单本销售情况
where销售时间>=p1
and销售时间<=p2
groupby图书名称)as x,book
where#bname=书名
and销售数量>=all(select count(图书编号)
from view_单本销售情况
where销售时间〉=p1
and销售时间<=p2
group by图书名称)
end
go
建立触发器(另外5个表也建立相应曾删改触发器,不过此处从略,详情见附件源代码)
建立一个customer得操作审核表,并建立相关触发器,当向customer中插入、更新或删除记录时,生成一条操作记录插入到该操作审核表中,内容包括客户编号、客户名称、操作方式(插入/更新/删除)与操作时间
--—-建一个操作审核表
create table customer_operate
(客户编号char(8)notnull,
客户名称char(8)not null,
操作方式char(4)notnull,
操作时间datetime not null)
-———建立相关触发器
create triggertrigger_customer_insert
oncustomer
forinsert
as
begin
declarep1 char(8),p2 char(8)
set p1=(select#cno from inserted)
set p2=(select cname frominserted)
print’insert:’
select*from inserted
insertinto customer_operatevalues(p1,p2,’插入’,getdate())end
go
createtrigger trigger_customer_delete
on customer
fordelete
as
begin
declare p1char(8),p2char(8)
set p1=(select#cno from deleted)
set p2=(select cname from deleted)
print’deleted:'
select*fromdeleted
insert into customer_operatevalues(p1,p2,'删除’,getdate())end
go
createtrigger trigger_customer_update
oncustomer
for update
as
begin
declarep1char(8),p2char(8)
set p1=(select #cno from deleted)
setp2=(selectcname from deleted)
print'inserted:’
select*from inserted
print'deleted:'
select*from deleted
insert into customer_operate values(p1,p2,’修改’,getdate())end
go
建立索引(由于数据库比较小,没有必要建立索引)实现数据库(有附件源代码与该数据库源文件)过程功能验证
向基本表插入适量如下数据并显示基本表信息
everybook???book
Suppilier
#suppiler address telephone contact大旗上海王平
红方上海李景
长城江苏张艳丽
高原郑州殷风注:此处插入数据应当book在everybook 之前插入数据(外键)
截图得:
视图显示基本信息
-——用显示视图基本信息
select*from view_单本销售情况
select*from view_供应商信息select*from view_客户信息
select*fromview_同种销售信息select*from view_图书订购信息
截图得:
执行存储过程完成目标查询
某种图书库存查询
exec sp_某种图书库存查询’烈火如歌'
本月业绩查询
exec sp_查询某段时间内得业绩'2013-7—1’,’2013-7-31’
本月销售最好图书信息查询
exec sp_查询某段时间内销售最好得图书信息'2013—7-1’,'2013—7—31’
截图得:
用普通查询完成目标查询(两次查询同时显示) 订购超3次客户信息查询
—-—订购超次客户信息查询
select*from view_客户信息
where客户编号=any(
select#cno frombook_sell
groupby #cno
havingcount(*)>3)
按供应商名称查询订购信息
---按供应商名称查询订购信息
select*fromview_图书订购信息
order by供应商名称
截图得:
注:数据检查得,确实没有订购超3次得客户。
验证触发器
-—验证触发器
insert into customer values(’00000005’,'陈利',’女','21’) go
updatecustomer
set cname=’陈丽'
where cname=’陈利'
go
delete from customer
where cname='陈丽’
select*from customer_operate
go
截图得: