数据库应用课程设计—数据库设计部分
学号: 姓名:_____项目名称:___仓库管理系统______
1.创建数据库及数据表:建立Test数据库,存储仓库信息、仓库员工信息、货物信息、单位信息和货物存取信息,该数据库包含八张数据表,即仓库基本信息表“仓库”,仓库员工信息表“仓库员工”,货物基本信息表“货物”,单位基本信息表“单位”,货物入库信息表“入库”,货物出库信息表“出库”,货物库存信息表“库存”,仓库盘库信息表“盘库”。
1)各数据表的逻辑结构如下:
仓库员工(员工编号,姓名,性别,联系方式,职称,银行卡号,所属仓库编号),其中主码为员工编号;
仓库(仓库编号,仓库名称,管理员编号,管理员),其中主码为仓库编号,外码为管理员编号; 货物(货物编号,货物名称,所属单位),其中主码为货物编号;
单位(单位编号,单位名称,联系方式,地址),其中主码为单位编号;
库存(仓库编号,货物编号,数量),其中主码为(仓库编号,货物编号);
入库(入单号,仓库编号,货物编号,入库数量,入库时间),其中主码为入单号,外码为仓库编号和货物编号;
出库(出单号,仓库编号,货物编号,出库数量,出库时间),其中主码为出单号,外码为仓库编号和货物编号;
盘库(盘库号,仓库编号,盘库时间,记录是否有误),其中主码为盘库号,外码为仓库编号;
2)创建数据库及数据表的SQL语句如下:
create database Test
use Test;
createtable仓库员工
(员工编号char(10)primarykey,
姓名char(10)notnull,
性别char(10)notnull,
联系方式char(15)notnull,
职称char(10)notnull,
银行卡号char(20)notnull,
所属仓库编号char(10)
);
createtable仓库
(仓库编号char(10)primarykey,
仓库名称char(10)notnull,
管理员char(10)notnull,
管理员编号char(10)notnull,
foreignkey(管理员编号)references仓库员工(员工编号)
);
createtable货物
(货物编号char(10)primarykey,
名称char(10)notnull,
所属单位char(10)notnull
);
createtable单位
(单位编号char(10)primarykey,
单位名称char(20)notnull,
联系方式char(15)notnull,
地址char(40)notnull
);
createtable库存
(仓库编号char(10)notnull,
货物编号char(10)notnull,
数量intnotnull,
primarykey(仓库编号,货物编号)
);
createtable入库
(入单号char(20)primarykeynotnull,
仓库编号char(10)notnull,
货物编号char(10)notnull,
入库时间char(20)notnull,
入库数量intnotnull
);
createtable出库
(出单号char(20)primarykeynotnull,
仓库编号char(10)notnull,
货物编号char(10)notnull,
出库时间char(20)notnull,
出库数量intnotnull
);
createtable盘库
(盘库号char(20)primarykeynotnull,
仓库编号char(10)notnull,
盘库时间char(20)notnull,
记录是否有误char(10)notnull
);
3)输入数据到所创建的数据库表。具体数据如下:
①仓库员工表的数据:
员工编号姓名性别联系方式职称银行卡号所属仓库编号
1500001 张三男 12345678901管理员 622123xxxxxxxxxxxx 001 1500002 李四男 12345678902 管理员 622123xxxxxxxxxxxx 002 1500003 王红女 12345678903 管理员 622123xxxxxxxxxxxx 003 1500004 张军男 12345678904 普工 622123xxxxxxxxxxxx 001 1500005 林静女 12345678905 普工 622123xxxxxxxxxxxx 002
②仓库表的数据:
仓库编号仓库名称管理员编号管理员
001 cangku001 1500001 张三
002 cangku002 1500002 李四
003 cangku003 1500003 王红
③货物表的数据:
货物编号货物名称所属单位
h00001 杯子xx公司
h00002 筷子xx公司
④单位表的数据:
单位编号单位名称联系方式地址
d001 xx公司 137xxxxxxxx 福建省漳州市芗城区xx街道 ⑤库存表数据:
仓库编号货物编号数量
001 h00001 1000
001 h00002 1500
002 h00001 500
⑥入库表数据:
入单号仓库编号货物编号入库数量入库时间
r15110001 001 h00001 400 2015.11.20 10:21:10
⑦出库表数据:
出单号仓库编号货物编号出库数量出库时间
C15110001 001 h00001 100 2015.11.22 09:27:35
⑧盘库表数据:
盘库号仓库编号货物编号盘库数量盘库时间
P15110001 001 h00001 1250 2015.11.24 20:15:28
2.创建视图和存储过程,能够根据给定参数进行信息查询。
输入货物名称,可以查询该货物所对应的货物的编号、名称、所属单位、所在仓库编号和对应的数量。
1) 创建视图
use Test
createview货物_库存
as
select货物.货物编号,名称,所属单位,仓库编号,数量
from货物,库存
where货物.货物编号=库存.货物编号
withcheckoption;
2) 测试视图:查看视图内容
select*from货物_库存;
3) 创建存储过程
use Test
createprocedure货物_info2 @name varchar(40)
as
select*from货物_库存where名称=@name;
4) 测试存储过程:给出所要查询的货物名称,执行存储过程
测试1:exec货物_info2 '杯子';
执行结果如下:
货物编号名称所属单位仓库编号数量
h00001 杯子xx公司001 1000
h00001 杯子xx公司 002 500
测试2:exec货物_info2 '筷子';
执行结果如下:
货物编号名称所属单位仓库编号数量
h00002 筷子xx公司001 1500
3.为Test数据库的货物表创建一个存储过程insert_货物信息。该存储过程的功能是向货物表添加一条记录,该记录各字段的值是在执行存储过程时给出的相应参数值。
1)创建一个带有三个输入参数的存储过程insert_货物信息
use Test;
createprocedure [insert_货物信息]
(@货物编号[char](10),
@名称[char](10),
@所属单位[char](10))
asinsertinto货物(货物编号,名称,所属单位)
values
(@货物编号,@名称,@所属单位)
go
2)测试存储过程,有2种方法
第1种方法
use Test;
exec insert_货物信息'h00003','圆珠笔','xx公司'
go
测试结果如下:
(所影响的行数为 1 行)
打开货物表,发现新增加了一个条记录('h00003','圆珠笔','xx公司')
第2种方法
use Test;
exec insert_货物信息
@货物编号='h00004',
@名称='铅笔',
@所属单位='xx公司'
Go
测试结果如下:
(所影响的行数为 1 行)
打开货物表,发现新增加了一个条记录('h00004','铅笔','xx公司')
4.使用T-SQL创建触发器监视属性值的修改。
在货物表建立触发器,监视名称属性列是否有被修改, 如果是,给出提示,并将修改前后的数据保存到另外的表中。
1) 先创建一个新表货物_log
use Test
createtable货物_log
(货物编号char(10),
名称char(10));
go
2) 在货物表上创建一个触发器,监视名称属性列是否有被修改, 如果名称属性列被修改,则给出提示,并将修改前后的数据保存到另外的表货物_log中。
createtrigger货物s_log
on货物
forupdate
as
ifupdate(名称)
begin
print('名称被修改了!')
/*保存旧的信息*/
insertinto货物_log
(货物编号,名称)
select
货物编号,名称
from deleted
/*保存新的信息*/
insertinto货物_log
(货物编号,名称)
select
货物编号,名称
from inserted
end
go
3)测试触发器。
①对货物表的名称属性列进行修改,在查询分析器上输入以下代码:
update货物set名称='橡皮擦'where货物编号='h00004';
测试结果如下:
名称被修改了!
(1 行受影响)
(1 行受影响)
(1 行受影响)
即在结果栏中看到该代码执行后影响的行数为3,分别是更新了货物表中的一行,向新表货物_log中插入了2行。
②对货物表的所属单位属性列进行修改,在查询分析器上输入以下代码:
update货物set所属单位='xx有限公司'where货物编号='h00004';
测试结果如下:
(1 行受影响)
即在结果栏中看到该代码执行后影响的行数为1行,这1行仅是更新了货物表中的数据,因为没有更新到名称属性列的数据,因此,并没有向新表货物_log插入任何数据。
5.创建DELETED触发器。
1)在仓库员工表中增加一列:statu,类型为:bit。仓库员工表的结构如下:
仓库员工表中的数据如下:
2)在仓库员工表中建立触发器:当从表中删除课程信息时,检查statu属性的状态,如果为‘True’则不允许删除,否则可以删除。
1)创建触发器
use Test
createtrigger Delete_仓库员工
on仓库员工
fordelete
as
declare @status bit
select @status=statu from deleted
if @status=1
begin
raiserror('该员工信息不允许删除!',16,1)
rollbacktransaction
end
else
raiserror('成功删除!',16,1)
go
2)测试触发器:
a)先删除statu值为“False”的员工信息,语句如下:
delete仓库员工where员工编号='1500004'
根据设计要求,该记录应该可以符合成功删除要求,其返回结果如下:
消息50000,级别16,状态1,过程Delete_仓库员工,第13 行
成功删除!
(1 行受影响)
b)再删除statu值为“True”的员工信息,语句如下:
delete仓库员工where员工编号='1500005'
按照触发器的设计要求,该记录不能删除,执行此语句后的服务器返回以下信:
消息50000,级别16,状态1,过程Delete_仓库员工,第9 行
该员工信息不允许删除!
消息3609,级别16,状态1,第18 行
事务在触发器中结束。批处理已中止。
6.创建带返回值的存储过程进行查询
1)创建存储过程。创建一个带有1个输入参数、2个返回值的存储过程search_货物,其功能是:接受外部传入的货物编号,在数据表货物中查找货物信息,然后输出货物的名称、所属单位。
use Test
createprocedure search_名称
(@货物编号s char(10),
@名称s char(10)output,
@所属单位s char(10)output)
as
select @名称s=名称,
@所属单位s=所属单位
from货物
where货物编号=@货物编号s
2)测试该存储过程,
use Test
declare @名称s char(10)
declare @所属单位s char(10)
exec search_名称'h00002',@名称s output,@所属单位s output
print'货物名称:'+rtrim(@名称s)+';所属单位:'+rtrim(@所属单位s)
go
运行结果如下:
货物名称:筷子;所属单位:xx公司
7.使用T-SQL创建带有输入参数,并使用集聚函数的存储过程进行查询。
创建存储过程,分别查询存储n种货物的仓库名单,要求显示仓库编号、仓库名称。其中n作为输入参数在执行系统存储过程时给出。
1)创建存储过程
use Test
createprocedure P_仓库
@num int
as
print'存储'+convert(varchar(5),@num)+'种货物的仓库名称及编号:'
select仓库名=(select仓库名称from仓库where仓库编号=库存.仓库编号),编号=仓库编号 from库存groupby仓库编号havingcount(*)=@num
2)测试存储过程
exec P_仓库@num=1
执行结果如下:
存储1种货物的仓库名称及编号:
(1 行受影响)
exec P_仓库@num=2
执行结果如下:
存储2种货物的仓库名称及编号:
(1 行受影响)
第二篇:数据库设计心得体会
数据库设计心得体会
跟老板做了两个算是比较大的项目,数据库主体都是我设计的。第一个感觉很失败;第二个现在正在用,虽然总结了第一个的教训,但感觉还是有些遗憾。把这过程中的一些心得记在这里,以便日后用到时来查阅。若以后还有机会再设计数据库——现在倒还有些期待,呵呵,再有新的体会,也全部补充到这里。
1.尽量使用数据冗余。
随着磁盘容量的大幅飙升,这一点已经不会产生什么问题。当然冗余归冗余,不能把数据的关联弄的乱七八糟的。
本科数据库课程中学的知识直接拿来,在实际中会出大问题。满足三级范式的数据库结构会让你面对大量的连表查询,应用程序中会用到大量的数据库访问,既繁琐(烦死你)又使程序运行速度减慢。
2.尽量不要使用varchar(max)类型
这一点主要是用动软代码生成器自动生成代码时,如果varchar的最大长度指定为max,在自动生成代码时,它无法生成这一最大长度,需要手动补进去。
现在感觉用个varchar(1000)就够了。
3.使用预留字段。
数据库表(尤其是动态表格),在你把所有字段都设计好了之后,再添加几个备注字段和预留字段。
之前我觉得这样做没多大意义,因为预留字段的列名是没有实际意义的。这样程序中使用的时候就会让人费解。但现在觉得还是有必要的,很有必要的,即便在用到时需要自己十分清楚之前预留的无意义字段现在表示什么意义。不过我的第二个数据库中还是没采用,这也是遗憾之处啊。
个人感觉用note1、note2、r1(r表示reserve)、r2、r3,2个备注字段和3个预留字段就足够了,再多的话就不容易记住哪个字段具体表示什么意义了,容易晕。类型就都用varchar(200)吧。
数据库设计心得体会(2):
在我看来,数据库课程设计主要的目标是利用课程中学到的数据库知识和技术较好的开发设计出数据库应用系统,去解决各行各业信息化处理的要求。通过这次的课程设计,可以巩固我们对数据库基本原理和基础理论的理解,掌握数据库应用系统设计开发的基本方法,进一步提高我们综合运用所学知识的能力。
当我们这组决定做大学生就业咨询系统时,我们并没有着手写程序。而是大家一起商量这个系统概述、系统目标、系统需求、业务流程分析、数据流程分析和数据词典。当这些都准备好了之后,我们进行模块的分工。每个人都有自己的模块设计,而且写出来的代码要求可以实现相应模块的功能,得到理想的效果。当每个人都把自己的分工做好了,最后会由一个人把这些全部组合搭建在一起。我们使用的是html和php相互嵌套使用,当一个系统做好了之后,我会好好地把程序都看一遍,理会其中的奥秘。
我所负责的是数据库的备份和还原还有一些界面的实现。还记得自己刚接触html的时候,觉得很感兴趣,所以有一段时间几乎到了痴迷的程度。然而php是我刚接触不久的一种编程语言。不过觉得它的功能真的很强大,可以开发出很多大型的系统。但是在做备份和还原的时候,要考虑的东西还是很多的。当我遇到错误的时候,感到很受打击。值得欣慰的是,在同学的帮助和大量参考书的查阅下,我把自己的模块做好了。这就是我收获最大的地方。而且,我明白了遇到困难永不放弃的重要性,我知道了团队合作的重要性,我领悟了只有坚持不懈才会取得胜利。
知识的获得是无止境的,只要你想学,只要你行动,没有什么会难倒我们的。回首这一个多星期的课程设计,我很欣慰。因为我有了动力,有了勇气。
谢谢老师对我们的不懈帮助,谢谢学校给了我们这一次实践的机会,也谢谢组员们的关怀。这些美好的回忆美好的东西将永远伴随着我。