资源描述
《数据库原理及应用》课程设计报告
专业: 信息管理与信息系统
班级: 信息0801
学号:
姓名: 黄露
题目名称:银行储蓄业务管理系统
完毕日期: .3.11
目录
一、系统定义…………………………………………………..3
二、需求分析…………………………………………………..3
(一)系统综合需求
(二)系统逻辑模型
1.数据流图:
2.数据字典
三、系统设计…………………………………………………...5
(一)概念构造设计
E-R图:
(二)逻辑构造设计
四、详细设计……………………………………………………6
(一) 开发平台及工具
(二)数据库分析
五、源程序清单……………………………………………13
六、设计心得…………………………………………………………18
一、系统定义:
银行是一种国家正常运转必不可缺机构,当今社会,几乎是每个人都会涉及到储蓄业务,为此,为以便顾客查询和使用各种业务,可用计算机为工具对查询管理为一体各种服务。固然,这样一种银行储蓄业务系统就应运而生了。本系统是一种简朴储蓄系统,可以对储户信息进行查询修改以及删除。
二、需求分析:
(一)系统综合需求
本系统是银行顾客存取款系统。重要功能是管理各个顾客存取款有关数据。
储户填写存款单或取款单输入系统,如果是存款,则系统记录存款人姓名,住址(或电话号码),身份证号码,存款类型,存款金额,存款日期等信息,并打印存单给储户;如果是取款,则需要输入帐号、取款金额等信息,核对对的后系统打印出清单给储户。
(二)系统逻辑模型
1.数据流图:
图1-1 系统数据流图
2.数据字典
数据名字:注册申请表
数据来源:储户
数据目:储户信息
数据构成:姓名+密码+住址+身份证号码
数据名字:储户信息表
数据来源:储户
数据目:身份验证
数据构成:姓名+密码+住址+身份证号码+既有金额
数据名字:利息清单
数据来源:系统
数据目:储户
数据构成:利息+姓名+取款时间
数据名字:存单
数据来源:存款信息表
数据目:储户
数据构成:姓名+到期时间+存入类型+存入时间+利率+存入金额
数据名字:取款单
数据来源:储户
数据目:储户信息表
数据构成:姓名+到期时间+存入类型+存入时间+利率+取款金额+身份证号
数据名字:存款单
数据来源:储户
数据目: 存款信息表
数据构成:姓名+到期时间+存入类型+存入时间+利率+存入金额+身份证号
表1.1 系统数据字典
三、系统设计:
(一)概念构造设计
E-R图:
(二)逻辑构造设计
四、详细设计
(一) 开发平台及工具
l 开发工具 Microsoft Visual C++ 6.0
l DBMS: Microsoft SQL Server
l 建模工具: Microsoft Visio,word编辑器
阐明:为了以便实现系统以及个人熟悉限度因素,选取了VC++ 6.0开发平台。
在Windows平台上咱们所学过就只有MS SQL Server了,因此采用SQL Server来进行开发。
(二)银行储蓄业务数据库分析
1)本系统由三张表构成,详细如下:
表名
属性(字段)名
储户表
账号、身份证号、姓名、性别、身高、地址、存款余额
存款单表
存款单号、金额、存款方式、账号、存款日期
取款单表
取款单号、金额、取款方式、账号、取款日期
系统表基本信息
2)表间关系如下:
一种存款单或取款单属于一种顾客,一种顾客可以拥有多次存款单或取款单。顾客通过存款操作与存款单建立联系,通过取款操作与取款单建立联系。
3)数据准备
前期准备工作:
以system账户登录,创立新账户
create user dy identified by lyjn;
grant dba to dy;
connect dy/dy@orcl;
各个表详细信息和创立表代码如下:
储户表(luser)
字段(属性)含义
字段(属性)名
字段(属性)类型
账号
acnum
VARCHAR(5)
身份证号
id
NUMBER
姓名
name
VARCHAR2(20)
性别
sex
VARCHAR2(2)
身高
height
NUMBER(3,2)
地址
address
VARCHAR2(20)
存款余额(亿)
Balance(billion)
INT
创立储户表代码如下:
CREATE TABLE luser
(
acnum VARCHAR2(5) NOT NULL ,
id NUMBER NOT NULL ,
name VARCHAR2(20) NOT NULL ,
sex VARCHAR2(2) CHECK(sex IN ('男','女') ) ,
height NUMBER(3,2) NOT NULL,
address VARCHAR2(20) NOT NULL ,
balance INT NOT NULL
);
ALTER TABLE luser
添加主键约束
ADD CONSTRAINT XPKluser PRIMARY KEY (acnum);
存款单表(depositslip)
字段(属性)含义
字段(属性)名
字段(属性)类型
存款单号
dps_num
NUMBER
账号
acnum
VARCHAR2(5)
存款时间
dps_time
TIMESTAMP
金额(亿)
money
INT
存款方式
dps_way
VARCHAR2(10)
创立存款单表代码如下:
CREATE TABLE depositslip
(
dps_num NUMBER NOT NULL ,
money INT CHECK(money>=0) ,
dps_way VARCHAR2(10) NOT NULL ,
acnum VARCHAR2(5) NOT NULL ,
dps_time TIMESTAMP NULL
);
ALTER TABLE depositslip
添加主键约束
ADD CONSTRAINT XPKdepositslip PRIMARY KEY (dps_num,acnum);
ALTER TABLE depositslip
在depositslip表中acnum字段中添加外键约束
ADD (CONSTRAINT R_5 FOREIGN KEY (acnum) REFERENCES luser(acnum));
取款单表(drawslip)
字段(属性)含义
字段(属性)名
字段(属性)类型
取款单号
dw_num
NUMBER
账号
acnum
VARCHAR2(5)
取款时间
dw_time
TIMESTAMP
金额(亿)
Money
INT
取款方式
dw_way
VARCHAR2(10)
创立取款单表代码如下:
CREATE TABLE drawslip
(
dw_num NUMBER NOT NULL ,
money INT CHECK(money>=0),
dw_way VARCHAR2(10) NOT NULL ,
acnum VARCHAR2(5) NOT NULL ,
dw_time TIMESTAMP NULL
);
ALTER TABLE drawslip
添加主键约束
ADD CONSTRAINT XPKdrawslip PRIMARY KEY (dw_num,acnum);
ALTER TABLE drawslip
在drawslip表中acnum字段中添加外键约束
ADD (CONSTRAINT R_6 FOREIGN KEY (acnum) REFERENCES luser(acnum));
4)插入(insert)数据
1、插入储户表(luser)数据
insert into luser (ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values ('00001',3422101,'刘忠田','男',1.72 ,'北京市朝阳区',345);
insert into luser (ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values ('00002',3422102,'周正义','男',1.78,'天津市宝坻区',123);
insert into luser (ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values ('00003',3422103,'陈光标','男',1.80,'南京市新街口',333);
insert into luser (ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values ('00004',3422104,'张茵','女',1.65,'上海市黄浦区',234);
insert into luser (ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values ('00005',3422105,'陈丽华','女',1.70,'香港市旺角区',111);
2、插入存款单表(depositslip)数据
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98001,'00001',120,to_date('08-08-','dd-mm-yyyy'),'整存整取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98002,'00001',300,to_date('10-08-','dd-mm-yyyy'),'整存整取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98003,'00002',100,to_date('12-08-','dd-mm-yyyy'),'整存零取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98004,'00002',150,to_date('12-09-','dd-mm-yyyy'),'整存零取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98005,'00003',200,to_date('15-08-','dd-mm-yyyy'),'零存整取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98006,'00003',100,to_date('14-09-','dd-mm-yyyy'),'零存整取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98007,'00003',80,to_date('23-09-','dd-mm-yyyy'),'零存整取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98008,'00004',80,to_date('23-08-','dd-mm-yyyy'),'零存零取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98009,'00004',180,to_date('24-09-','dd-mm-yyyy'),'零存零取');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98010,'00005',190,to_date('24-08-','dd-mm-yyyy'),'告知存款');
insert into depositslip (DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values (98011,'00005',210,to_date('30-09-','dd-mm-yyyy'),'告知存款');
3、插入取款单表(drawslip)数据
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00001',75,to_date('08-08-','dd-mm-yyyy'),'柜台');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00002',27,to_date('08-09-','dd-mm-yyyy'),'取款机');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00002',100,to_date('12-10-','dd-mm-yyyy'),'柜台');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00003',47,to_date('15-08-','dd-mm-yyyy'),'取款机');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00004',26,to_date('12-09-','dd-mm-yyyy'),'取款机');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00005',100,to_date('23-09-','dd-mm-yyyy'),'柜台');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00005',150,to_date('10-10-','dd-mm-yyyy'),'柜台');
insert into drawslip (DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values (5,'00005',39,to_date('31-10-','dd-mm-yyyy'),'取款机');
5)索引
建立索引遵循规律:
1.建立在where子句经常引用列上,
2.经常需要排序列上,
3.连接属性列上等
在存款单表存款单号字段和账号字段建立组合索引
CREATE UNIQUE INDEX XPKdepositslip ON depositslip
(dps_num ASC,acnum ASC);
在存款单表账号字段建立索引
CREATE INDEX XIF1depositslip ON depositslip
(acnum ASC);
在取款单表取款单号字段和账号字段建立组合索引
CREATE UNIQUE INDEX XPKdrawslip ON drawslip
(dw_num ASC,acnum ASC);
在取款单表账号字段建立索引
CREATE INDEX XIF1drawslip ON drawslip
(acnum ASC);
在储户表账户字段上建立索引,以便查询
CREATE UNIQUE INDEX XPKluser ON luser
(acnum ASC);
6)触发器
1、插入存款,相应储户表相应储户余额(balance)增长插入记录包括金额数(money)
CREATE OR REPLACE TRIGGER OperatingDps
AFTER INSERT ON depositslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
update luser set balance=balance+n_mo where luser.acnum=n_ac;
END OperatingDps;
2、删除存款,相应储户表相应储户余额(balance)减去所删除记录金额数(money)
CREATE OR REPLACE TRIGGER OperatingDps2
AFTER DELETE ON depositslip
FOR EACH ROW
DECLARE
o_ac VARCHAR2(5);
o_mo INT;
BEGIN
o_ac:=:old.acnum;
o_mo:=:old.money;
update luser set balance=balance-o_mo where luser.acnum=o_ac;
END OperatingDps2;
3、插入取款,相应储户表相应储户余额(balance)减少插入记录包括金额数(money)
CREATE OR REPLACE TRIGGER OperatingDw
AFTER INSERT ON drawslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
update luser set balance=balance-n_mo where luser.acnum=n_ac;
END OperatingDw;
4、删除取款,相应储户表相应储户余额(balance)加上所删除记录金额数(money)
CREATE OR REPLACE TRIGGER OperatingDw2
AFTER DELETE ON drawslip
FOR EACH ROW
DECLARE
o_ac VARCHAR2(5);
o_mo INT;
BEGIN
o_ac:=:old.acnum;
o_mo:=:old.money;
update luser set balance=balance+o_mo where luser.acnum=o_ac;
END OperatingDw2;
5、插入取款金额(money)不不大于相应顾客余额(balance)时,系统报错
CREATE OR REPLACE TRIGGER OperatingDw3
AFTER insert ON drawslip
FOR EACH ROW
DECLARE
n_ac VARCHAR2(5);
n_mo INT;
n_ba INT;
BEGIN
n_ac:=:new.acnum;
n_mo:=:new.money;
select balance into n_ba from luser where acnum=n_ac;
if n_mo>n_ba then
RAISE_APPLICATION_ERROR(-0,'存款余额局限性!请重新插入存款!');
end if;
END OperatingDw3;
五、源程序清单
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
const int Max=100;
void Wait();
class User //顾客类声明
{
public:
User()
{
CurrentAcount=0; //初始化当前账户
}
void Resert1(User *u,double A)
{
u->CurrentAcount=u->CurrentAcount+A;
}
void Resert2(User *u,double A)
{
u->CurrentAcount=u->CurrentAcount-A;
}
char *getname() //获得顾客名
{
return name;
}
long getNum() //获得帐户号
{
return Num;
}
double getCurrentAcount()
{
return CurrentAcount;
}
void output() //输出有关信息
{
cout<<"顾客名:"<<name<<endl;
cout<<"账 号:"<<Num<<endl;
cout<<"余 额:"<<CurrentAcount<<endl;
}
void addUser(char *name,long Num)
{
strcpy(this->name,name);
this->Num=Num;
}
void Deposit(User *u,double Acount) //存款
{
u->Resert1(u,Acount);
}
void out(User *u,double acount) //取款
{
if(acount>u->getCurrentAcount())
{
cout<<"余额局限性.\n";
}
else
{
cout<<"请及时取走你钞票.\n";
u->Resert2(u,acount);
}
}
void Locate(User *u) //查询余额
{
u->output();
}
private:
char name[20];
long Num;
double CurrentAcount;
};
class DoBank //银行管理类声明
{
public:
DoBank()
{
User a;
top=-1;
fstream file("f:\\User.txt",ios::in); //以读方式打开文献
while(1)
{
file.read((char*)&a,sizeof(a));
if(!file) break;
top++;
b[top]=a;
}
file.close(); //关闭文献
}
void Work();
void addUser(char *name,int Num)
{
User *p=equal(Num);
if(p==NULL)
{
top++;
b[top].addUser(name,Num);
cout<<"成功载入\n\n\n";
}
else cout<<"该顾客已存在.\n";
}
User *equal(long Num)
{
int i;
for(i=0;i<top;i++)
if(b[i].getNum()==Num)
{
return &b[i];
}
return NULL;
}
~DoBank() //析构函数
{
fstream file("f:\\User.txt",ios::out); //以写方式打开文献
for (int i=0;i<=top;i++)
file.write((char *)&b[i],sizeof(b[i]));
file.close(); //关闭文献
}
private:
User b[Max];
int top;
};
void Wait()
{
int i=0;
while(i<)
{
i++;
}
}
void Menu() //显示功能菜单
{
cout<<"\n\n\n\n";
cout<<" 1、顾客维护\n";
cout<<" 2、存款\n";
cout<<" 3、取款\n";
cout<<" 4、查询\n";
cout<<" 0、退出\n";
}
void DoBank::Work()
{
Menu();
User *us;
User *us1;
char name[20];
long Num;
long Num1;
long TAcount;
char number;
cin>>number;
while(number!='0')
{
if((int)number<47||(int)number>53)
{cout<<"对不起,你输入有误。\n";}
else{
switch(number) //输入功能代号
{
case '1':
cout<<"请输入姓名:";
cin>>name;
cout<<"请输入账号:";
cin>>Num;
addUser(name,Num);
break;
case '2':
cout<<"请输入账号";
cin>>Num;
us=equal(Num);
if(us==NULL)
{
cout<<"不存在该顾客.\n";
}
else
{
cout<<"请输入存款金额:";
cin>>TAcount;
us->Deposit(us,TAcount);
}
cout<<"成功存入.\n\n\n";
break;
case '3':
cout<<"请输入账号:";
cin>>Num;
us=equal(Num);
if(us==NULL)
{
cout<<"不存在该顾客.\n";
}
else
{
cout<<"请输入取款金额:";
cin>>TAcount;
us->out(us,TAcount);
}
cout<<"\n\n\n";
break;
case '4':
cout<<"请输入查询账户:";
cin>>Num;
us=equal(Num);
if(us==NULL)
{
cout<<"不存在该账户.\n";
}
else
{
us->Locate(us);
}
cout<<"\n\n\n";
break;
}}
system("pause");
system("cls");
Menu();
cout<<"请输入操作:";
cin>>number;
}
}
int main()
{ cout<<" ******************************************************\n";
cout<<" 欢迎进入银行管理系统 \n";
cout<<" ******************************************************\n" ;
DoBank b;
b.Work();
return 0;
}
六、设计心得
一方面要自我检讨一下,说实话,这个系统没有做好,尚有诸多地方都存在着局限性甚至错误,毕竟基本知识学不是很夯实,再者,时间也比较仓促。确,以我当前水平用来做系统还做不完善,因此,这次自己尝试虽然不算太成功,但毕竟自己专心了,只但愿下次可以有机会做得更好!
这次课程设计,我选取做银行储蓄系统,重要是觉得这个比较简朴看起来。但是,在做课程设计时候,也学了比较多知识,恶补了诸多此前功课。最开始时,面对这样某些题目,平时也没怎么对课本学精我当时就懵了,因此只有暂时抱佛脚,在网上查阅了大量资料。说实话,此前上数据库课,一开始完全像听天书同样,虽然考迈进行了紧锣密鼓备考,但仅仅也只是冰山一角。但是日后慢慢逐渐理解多了,做课程设计过程就是对课本知识巩固、贯通和实践运用过程,从中学到东西也是数不胜数。
课程设计是告一段落了,但是这一周下来,我发现,只要坚持,其实同样也可以完毕,虽然不是很完美。由于班干部疏忽,这次课程设计诸多时候基本都没人告知什么时候去或者不去。前一天晚上咱们都还不懂得在哪儿进行,几点集中档等都一概不知。咱们班信息太滞后了,要不是自己去问话主线就没人告知。周三下午咱们宿舍急匆匆忙赶过去,成果被告知今天机房不开,休息一天,打扫卫生。总来说,咱们还是很积极去做这些事。有什么不懂都去问别人,一定要会做才好。像画图时候,用画图工具一开始都不太会用,学了半天日后还是觉得word比较好用,凑合歪歪扭扭画了某些。时间有点紧张,学也没学好,一周时间貌似不太够用,如果真要做出一种系统出来话。但愿后来教师多给咱们点时间,并加以指引就更好了~
从这次实习中,我体会到了实际工作与课本上知识是有一定距离,并且还需要进一步再学习。要想做好一种数据库,没有一定底子是完全不够。这次说来很羞愧,由于好多资料都是从网上找,自己写某些其实尚有错,但由于时间关系,也就没来得及改正了,如果后来尚有这样机会话,我想我一定会把它做好,做精。
展开阅读全文