信息080108112黄露银行储蓄管理数据库课程设计.docx
《信息080108112黄露银行储蓄管理数据库课程设计.docx》由会员分享,可在线阅读,更多相关《信息080108112黄露银行储蓄管理数据库课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
信息080108112黄露银行储蓄管理数据库课程设计
《数据库原理及应用》课程设计报告
专业:
信息管理与信息系统
班级:
信息0801
学号:
081204112
姓名:
黄露
题目名称:
银行储蓄业务管理系统
完成日期:
2011.3.11
一、系统定义…………………………………………………..3
二、需求分析…………………………………………………..3
(一)系统综合需求
(二)系统逻辑模型
1.数据流图:
2.数据字典
三、系统设计…………………………………………………...5
(一)概念结构设计
E-R图:
(二)逻辑结构设计
四、详细设计……………………………………………………6
(一)开发平台及工具
(二)数据库分析
五、源程序清单……………………………………………13
六、设计心得…………………………………………………………18
一、系统定义:
银行是一个国家正常运转必不可缺的机构,当今社会,几乎是每个人都会涉及到储蓄业务,为此,为方便用户查询和使用各种业务,可用计算机为工具对查询管理为一体的各种服务。
当然,这样的一个银行储蓄业务系统就应运而生了。
本系统是一个简单的储蓄系统,可以对储户的信息进行查询修改以及删除。
二、需求分析:
(一)系统综合需求
本系统是银行用户的存取款系统。
主要功能是管理各个用户存取款的相关数据。
储户填写的存款单或取款单输入系统,如果是存款,则系统记录存款人姓名,住址(或电话号码),身份证号码,存款类型,存款金额,存款日期等信息,并打印存单给储户;如果是取款,则需要输入帐号、取款金额等信息,核对正确后系统打印出清单给储户。
(二)系统逻辑模型
1.数据流图:
图1-1系统数据流图
2.数据字典
数据名字:
注册申请表
数据来源:
储户
数据目的:
储户信息
数据组成:
姓名+密码+住址+身份证号码
数据名字:
储户信息表
数据来源:
储户
数据目的:
身份验证
数据组成:
姓名+密码+住址+身份证号码+现有金额
数据名字:
利息清单
数据来源:
系统
数据目的:
储户
数据组成:
利息+姓名+取款时间
数据名字:
存单
数据来源:
存款信息表
数据目的:
储户
数据组成:
姓名+到期时间+存入类型+存入时间+利率+存入金额
数据名字:
取款单
数据来源:
储户
数据目的:
储户信息表
数据组成:
姓名+到期时间+存入类型+存入时间+利率+取款金额+身份证号
数据名字:
存款单
数据来源:
储户
数据目的:
存款信息表
数据组成:
姓名+到期时间+存入类型+存入时间+利率+存入金额+身份证号
表1.1系统数据字典
三、系统设计:
(一)概念结构设计
E-R图:
(二)逻辑结构设计
四、详细设计
(一)开发平台及工具
●开发工具MicrosoftVisualC++6.0
●DBMS:
MicrosoftSQLServer2000
●建模工具:
MicrosoftVisio,word编辑器
说明:
为了方便的实现系统以及个人熟悉程度的因素,选择了VC++6.0的开发平台。
在Windows平台上我们所学过的就只有MSSQLServer了,所以采用SQLServer2000来进行开发。
(二)银行储蓄业务数据库分析
1)本系统由三张表组成,具体如下:
表名
属性(字段)名
储户表
账号、身份证号、姓名、性别、身高、地址、存款余额
存款单表
存款单号、金额、存款方式、账号、存款日期
取款单表
取款单号、金额、取款方式、账号、取款日期
系统表基本信息
2)表间关系如下:
一个存款单或取款单属于一个用户,一个用户可以拥有多次存款单或取款单。
用户通过存款操作与存款单建立联系,通过取款操作与取款单建立联系。
3)数据准备
前期准备工作:
以system账户登录,创建新账户
createuserdyidentifiedbylyjn;
grantdbatody;
connectdy/dy@orcl;
各个表的具体信息和创建表的代码如下:
储户表(luser)
字段(属性)含义
字段(属性)名
字段(属性)类型
账号
acnum
VARCHAR(5)
身份证号
id
NUMBER
姓名
name
VARCHAR2(20)
性别
sex
VARCHAR2
(2)
身高
height
NUMBER(3,2)
地址
address
VARCHAR2(20)
存款余额(亿)
Balance(billion)
INT
创建储户表的代码如下:
CREATETABLEluser
(
acnumVARCHAR2(5)NOTNULL,
idNUMBERNOTNULL,
nameVARCHAR2(20)NOTNULL,
sexVARCHAR2
(2)CHECK(sexIN('男','女')),
heightNUMBER(3,2)NOTNULL,
addressVARCHAR2(20)NOTNULL,
balanceINTNOTNULL
);
ALTERTABLEluser
添加主键约束
ADDCONSTRAINTXPKluserPRIMARYKEY(acnum);
存款单表(depositslip)
字段(属性)含义
字段(属性)名
字段(属性)类型
存款单号
dps_num
NUMBER
账号
acnum
VARCHAR2(5)
存款时间
dps_time
TIMESTAMP
金额(亿)
money
INT
存款方式
dps_way
VARCHAR2(10)
创建存款单表的代码如下:
CREATETABLEdepositslip
(
dps_numNUMBERNOTNULL,
moneyINTCHECK(money>=0),
dps_wayVARCHAR2(10)NOTNULL,
acnumVARCHAR2(5)NOTNULL,
dps_timeTIMESTAMPNULL
);
ALTERTABLEdepositslip
添加主键约束
ADDCONSTRAINTXPKdepositslipPRIMARYKEY(dps_num,acnum);
ALTERTABLEdepositslip
在depositslip表中的acnum字段中添加外键约束
ADD(CONSTRAINTR_5FOREIGNKEY(acnum)REFERENCESluser(acnum));
取款单表(drawslip)
字段(属性)含义
字段(属性)名
字段(属性)类型
取款单号
dw_num
NUMBER
账号
acnum
VARCHAR2(5)
取款时间
dw_time
TIMESTAMP
金额(亿)
Money
INT
取款方式
dw_way
VARCHAR2(10)
创建取款单表的代码如下:
CREATETABLEdrawslip
(
dw_numNUMBERNOTNULL,
moneyINTCHECK(money>=0),
dw_wayVARCHAR2(10)NOTNULL,
acnumVARCHAR2(5)NOTNULL,
dw_timeTIMESTAMPNULL
);
ALTERTABLEdrawslip
添加主键约束
ADDCONSTRAINTXPKdrawslipPRIMARYKEY(dw_num,acnum);
ALTERTABLEdrawslip
在drawslip表中的acnum字段中添加外键约束
ADD(CONSTRAINTR_6FOREIGNKEY(acnum)REFERENCESluser(acnum));
4)插入(insert)数据
1、插入储户表(luser)数据
insertintoluser(ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values('00001',3422101,'刘忠田','男',1.72,'北京市朝阳区',345);
insertintoluser(ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values('00002',3422102,'周正义','男',1.78,'天津市宝坻区',123);
insertintoluser(ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values('00003',3422103,'陈光标','男',1.80,'南京市新街口',333);
insertintoluser(ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values('00004',3422104,'张茵','女',1.65,'上海市黄浦区',234);
insertintoluser(ACNUM,ID,NAME,SEX,HEIGHT,ADDRESS,BALANCE)
values('00005',3422105,'陈丽华','女',1.70,'香港市旺角区',111);
2、插入存款单表(depositslip)数据
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98001,'00001',120,to_date('08-08-2009','dd-mm-yyyy'),'整存整取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98002,'00001',300,to_date('10-08-2009','dd-mm-yyyy'),'整存整取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98003,'00002',100,to_date('12-08-2009','dd-mm-yyyy'),'整存零取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98004,'00002',150,to_date('12-09-2009','dd-mm-yyyy'),'整存零取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98005,'00003',200,to_date('15-08-2009','dd-mm-yyyy'),'零存整取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98006,'00003',100,to_date('14-09-2009','dd-mm-yyyy'),'零存整取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98007,'00003',80,to_date('23-09-2009','dd-mm-yyyy'),'零存整取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98008,'00004',80,to_date('23-08-2009','dd-mm-yyyy'),'零存零取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98009,'00004',180,to_date('24-09-2009','dd-mm-yyyy'),'零存零取');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98010,'00005',190,to_date('24-08-2009','dd-mm-yyyy'),'通知存款');
insertintodepositslip(DPS_NUM,ACNUM,MONEY,DPS_TIME,DPS_WAY)
values(98011,'00005',210,to_date('30-09-2009','dd-mm-yyyy'),'通知存款');
3、插入取款单表(drawslip)数据
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52001,'00001',75,to_date('08-08-2010','dd-mm-yyyy'),'柜台');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52002,'00002',27,to_date('08-09-2010','dd-mm-yyyy'),'取款机');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52003,'00002',100,to_date('12-10-2010','dd-mm-yyyy'),'柜台');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52004,'00003',47,to_date('15-08-2010','dd-mm-yyyy'),'取款机');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52005,'00004',26,to_date('12-09-2010','dd-mm-yyyy'),'取款机');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52006,'00005',100,to_date('23-09-2010','dd-mm-yyyy'),'柜台');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52007,'00005',150,to_date('10-10-2010','dd-mm-yyyy'),'柜台');
insertintodrawslip(DW_NUM,ACNUM,MONEY,DW_TIME,DW_WAY)
values(52008,'00005',39,to_date('31-10-2010','dd-mm-yyyy'),'取款机');
5)索引
建立索引遵循的规律:
1.建立在where子句经常引用的列上,
2.经常需要排序的列上,
3.连接属性列上等
在存款单表的存款单号字段和账号字段建立组合索引
CREATEUNIQUEINDEXXPKdepositslipONdepositslip
(dps_numASC,acnumASC);
在存款单表的账号字段建立索引
CREATEINDEXXIF1depositslipONdepositslip
(acnumASC);
在取款单表的取款单号字段和账号字段建立组合索引
CREATEUNIQUEINDEXXPKdrawslipONdrawslip
(dw_numASC,acnumASC);
在取款单表的账号字段建立索引
CREATEINDEXXIF1drawslipONdrawslip
(acnumASC);
在储户表的账户字段上建立索引,方便查询
CREATEUNIQUEINDEXXPKluserONluser
(acnumASC);
6)触发器
1、插入存款,对应储户表的相应储户的余额(balance)增加插入记录包含的金额数(money)
CREATEORREPLACETRIGGEROperatingDps
AFTERINSERTONdepositslip
FOREACHROW
DECLARE
n_acVARCHAR2(5);
n_moINT;
BEGIN
n_ac:
=:
new.acnum;
n_mo:
=:
new.money;
updatelusersetbalance=balance+n_mowhereluser.acnum=n_ac;
ENDOperatingDps;
2、删除存款,对应储户表的相应储户的余额(balance)减去所删除记录的金额数(money)
CREATEORREPLACETRIGGEROperatingDps2
AFTERDELETEONdepositslip
FOREACHROW
DECLARE
o_acVARCHAR2(5);
o_moINT;
BEGIN
o_ac:
=:
old.acnum;
o_mo:
=:
old.money;
updatelusersetbalance=balance-o_mowhereluser.acnum=o_ac;
ENDOperatingDps2;
3、插入取款,对应储户表的相应储户的余额(balance)减少插入记录包含的金额数(money)
CREATEORREPLACETRIGGEROperatingDw
AFTERINSERTONdrawslip
FOREACHROW
DECLARE
n_acVARCHAR2(5);
n_moINT;
BEGIN
n_ac:
=:
new.acnum;
n_mo:
=:
new.money;
updatelusersetbalance=balance-n_mowhereluser.acnum=n_ac;
ENDOperatingDw;
4、删除取款,对应储户表的相应储户的余额(balance)加上所删除记录的金额数(money)
CREATEORREPLACETRIGGEROperatingDw2
AFTERDELETEONdrawslip
FOREACHROW
DECLARE
o_acVARCHAR2(5);
o_moINT;
BEGIN
o_ac:
=:
old.acnum;
o_mo:
=:
old.money;
updatelusersetbalance=balance+o_mowhereluser.acnum=o_ac;
ENDOperatingDw2;
5、插入的取款金额(money)大于对应用户的余额(balance)时,系统报错
CREATEORREPLACETRIGGEROperatingDw3
AFTERinsertONdrawslip
FOREACHROW
DECLARE
n_acVARCHAR2(5);
n_moINT;
n_baINT;
BEGIN
n_ac:
=:
new.acnum;
n_mo:
=:
new.money;
selectbalanceinton_bafromluserwhereacnum=n_ac;
ifn_mo>n_bathen
RAISE_APPLICATION_ERROR(-20000,'存款余额不足!
请重新插入存款!
');
endif;
ENDOperatingDw3;
五、源程序清单
#include
#include
#include
usingnamespacestd;
constintMax=100;
voidWait();
classUser//用户类的声明
{
public:
User()
{
CurrentAcount=0;//初始化当前的账户
}
voidResert1(User*u,doubleA)
{
u->CurrentAcount=u->CurrentAcount+A;
}
voidResert2(User*u,doubleA)
{
u->CurrentAcount=u->CurrentAcount-A;
}
char*getname()//取得用户名
{
returnname;
}
longgetNum()//取得帐户号
{
returnNum;
}
doublegetCurrentAcount()
{
returnCurrentAcount;
}
voidoutput()//输出相关信息
{
cout<<"用户名:
"<cout<<"账号:
"<cout<<"余额:
"<}
voidaddUser(char*name,longNum)
{
strcpy(this->name,name);
this->Num=Num;
}
voidDeposit(User*u,doubleAcount)//存款
{
u->Resert1(u,Acount);
}
voidout(User*u,doubleacount)//取款
{
if(acount>u->getCurrentAcount())
{
cout<<"余额不足.\n";
}
else
{
cout<<"请及时取走你的钞票.\n";
u->Resert2(u,acount);
}
}
voidLocate(User*u)//查询余额
{
u->output();
}
private:
charname[20];
longNum;
doubleCurre