1556.计算机科学与技术学院数据库课程设计报告银行管理系统

上传人:无*** 文档编号:118628212 上传时间:2022-07-12 格式:DOC 页数:30 大小:463.50KB
返回 下载 相关 举报
1556.计算机科学与技术学院数据库课程设计报告银行管理系统_第1页
第1页 / 共30页
1556.计算机科学与技术学院数据库课程设计报告银行管理系统_第2页
第2页 / 共30页
1556.计算机科学与技术学院数据库课程设计报告银行管理系统_第3页
第3页 / 共30页
点击查看更多>>
资源描述
第一章 绪论21.1 引言21.2 内容梗要2第二章 需求分析32.1 信息要求32.2 处理要求4 安全性与完整性要求6第三章 概念结构设计73.1 E-R图7一、实体集及属性描述7二、函数依赖7三、E-R图及实体集属性的计算方法83.2 表的冗余及外码约束9一、表的冗余9二、外码约束9第四章 逻辑结构设计10函数依赖的极小化处理104.2 E-R图到关系模型及其优化114.3 工作流程及用户子模式设计12一、管理员的工作流程及其子模式:12二、用户工作流程及子模式设计12第五章 数据库的实施与维护13管理员模块的功能模块分析及代码讲解13一、功能模块和功能概要13二、结合源代码和操作界面详细分析14客户模块的功能模块分析及代码讲解20一、客户模块的功能模块总轮廓及功能概要20二、结合源代码和操作界面详细分析21结束语29参考文献30第一章 绪论1.1 引言随着数据处理的不断进步和计算机网络的迅速发展,使数据库应用系统不仅在功能而且在结构上都有了深刻的变化,而且运用在生活的每一个方面。通过学习关系代数,关系演算,函数依赖,关系模式分解,关系模式的规范化让我们建立了扎实的关系数据库理论基础。而在掌握基本理论的基础上掌握关系数据库的设计方法,掌握现代信息系统的开发方法也显得尤为必要。目前在关系数据库中用得最多的SQL数据库,开发数据库的语言工具多数用DELPHI.。所以对于计算机专业的学生来说掌握数据库应用的基本技术,熟悉编程语言与SQL数据库的结合运用是我们计算机专业学生之必备本领。本次课程设计是以银行管理系统为模拟模型,运用DELPHI编程语言结合SQL数据库所开发系统。1.2 内容梗要此次课程设计针对设计要求主要要做以下工作,根据要求提炼数据库所需的信息,弄清楚数据库要实现的功能,及其完整性和安全性要求。由需求分析和依赖关系确立实体集及关系表,设立外码约束。创建适当的视图和事务。结合与用户的交互信息搭建友善的界面,根据功能的不同确立不同的模块,合理运用DELPHI语言和调用SQL语句达到数据库操作的目的。信息提取与处理见第二章内容。概念结构设计见第三章内容。逻辑机构设计见第四章内容,具体功能分析及代码详解见第五章内容。结合此次课程设计的过程将几个值得关注的问题列举如下:一、SQL中所要注意的问题: 数据库的建立,根据所需信息合理设立表。 确立外码约束,建关系图。 根据与用户所交互的信息,创造方便的视图以便于查询显示。 保证一些操作的原子性,即要创建事务。二、DELPHI中所注意的问题DELPHI中所遇到的问题主要怎样运用DELPHI开发工具设计出交互性好的界面,合理组织各单元文件之间的调用问题,及在DELPHI中调用SQL语句问题等等。第二章 需求分析2.1 信息要求一、 客户对于客户我们应该知道他的客户号,客户名,信用度,最大的经济支付能力。二、 存款功能对于一个客户,他在一个银行有且只有一个存款账号。但可在不同的银行都有存款,所以对于一个账号,我们需要知道其所在银行类型,账号,密码,存款额,最近存款日期。(假定存款利率都一样)三、 取款和透支对于客户取款,我们要知道他在用哪个卡型取款,即哪个银行,同时应该验证身份信息(卡号,密码)要知道该卡上的存款额,及此次的取款额。根据卡上的金额与所取金额的差值决定是否属于透支类型。若属于透支类型,需要知道客户以前的透支记录,即哪张卡上(卡型)什么时间(上一次透支日期)透支多少(金额)。若可以透支需根据客户的信誉度和经济能力确定用户的最大可透支额,用户根据其信息来透支所需金额。四、 贷款我们需要知道贷款类别(卡型)即哪个银行上贷款,然后根据客户的信誉度和经济承受能力来确定最大可贷多少款子给客户。同时我们应该给客户一个贷款号,根据其贷款的年数来确定客户的贷款利率,对于贷款我们还应该保存其贷款时间,还贷时间等。五、 还贷1 对于贷款的还贷:我们应该支持分期还贷服务,这样我们需要记录客户的每次还贷记录,即还贷的顺序号,此次还贷金额。2 对于透支的偿还:处理方法是,将下一次的存款额作为偿还透支的金额,直到透支额全部还清。六、 转账需要知道转账的卡型,卡号,密码(验证身份)。需要判断对方的卡型(确定转账费率问题),卡号(判断该卡是否存在)。如果转账金额大于该卡现有金额则转账失败。2.2 处理要求一、 存款的情况当用户在此次存款的卡上有透支额且没有还时,这次存款的金额将全部或部分作为偿还透支的金额(视透支的金额而定)。且存款或偿还透支操作需满足原子性,即要把这类操作设计成事务,要么全部执行,要么全部不执行。还应注意在这次存款前把该卡上已有的存款的利息算出来作为该卡上已有的本金。(我在本次设计中把存款利率按日计算,设为0.005)二、 取款的情况要判断此次取款的金额与卡上现存的金额的大小,如果取款额大于现存额则应该当作透支处理,接着应该判断该用户能不能透支,这主要依据他上次的透支额是否还清,如果还清了,则允许透支,否则不许。在允许透支的前提下,应该给出用户最大允许的透支额,这就要查询该用户的信誉度(A)和经济能力(B),透支主要是由信誉度决定的,在此次课程设计中我设置最大透支额1000A;(初始时用户的信誉度都设为10,以后视还透支的期限来设置信誉度)。这里还应注意在每次取款前,应该把前面所存款项的利息算出来作为此卡上已有的本金。三、 贷款的情况贷款主要是给出用户的最大可贷款额,这主要由用户的经济能力(B)决定。而在此次设计中用户的经济能力BMAX(用户曾经一次的存款额)10。还有用户的贷款应该不同于透支,应根据不同的贷款年限来设置贷款的利率。且应该支持分期付款。贷款应给出独立的贷款号。四、 偿还透支的情况这种情况主要发生在用户有透支且又在存款的条件下,即用户没有刻意地去还透支,而是在存款中不知不觉的还了。但应该注意上次透支的时间和这次存款的时间不应该超过最迟偿还透支期限(本次设计为100天),如果超过了,就将用户的信誉度(A)减1。当用户透支额全部还完的时候就删除透支记录。五、 偿还贷款的情况贷款可以分期支付,每次支付前都要把前面贷款的利息算出来作为此次贷款应还的金额。六、 转账的情况用户的转账额不能大于卡上现存金额,同时应该确定是同行转账还是异行转账以便收取不同的费率,同行则为0.02,异行为0.05。批注:无论存款,取款,贷款,还贷,还是转账都设计为事务,以保证原子性。在此次课程设计中为便于用户或管理员查阅信息,我把存/取款日志保存下来,还有还贷日志。2.3 安全性与完整性要求一、 安全性1 用户和管理员的权限设置:用户只能存款,取款,转账,还有查询存款情况和还贷情况,同时也可以修改自己的资料(譬如密码),不具有修改和查阅银行内部资料的权利。但银行管理员则可以,可以增添管理员,查阅银行的存取状况等。2 非法数据的输入:每个字段信息都有自己确定的类型,不能插入不合乎该类型的数据。可以在DELPHI程序中屏蔽掉,也可以在SQL数据库中作错误处理。3 用户查询情况:在用户的查询过程中一些数据应该屏蔽掉,比如用户在查询自己的存款状况时就应该屏蔽掉改客户的密码等。所以可以在查询语句中加以处理,也可以创建视图来实现数据的屏蔽。4 某些操作需要身份认证:取款,转账,修改资料等。二、 完整性要求:数据完整性是指数据的精确性和可靠性,首先就是实体的完整性,就是指每一行记录在表中是唯一的实体,不能插入有重复主码的记录。再一个就是参照完整性,是指两个表的主关键字和外关键字的数据对应一致,防止数据的丢失或者无意义的数据在数据库中的扩散。表现在:a 禁止在表中插入包含主表中不存在的关键字的数据行。b 禁止删除在从表中的有对应记录的主表记录。完整性问题可以通过一些工具来实现,如:规则,约束,触发器等。第三章 概念结构设计3.1 E-R图一、实体集及属性描述实体1:customer(客户)属性:customer_id name trust_abi(信誉度) pay_abi(经济能力)实体2:bank(银行)属性:card_type(卡型银行名称)adress(银行所在地) asset(银行现有存款)实体3:fund_bill(存款单)属性:card_type card_no keyword fortune_amount(存款金额) deposite_date(上次的存款日期)实体4:loan_pack(贷款)属性:loan_pack_no(贷款号) card_type(银行)loan_money payoff_date borrow_date rest_money(为了支持分期付款而设立的) rate(贷款利率)实体5:overdraft(透支)属性:card_type card_no amount date(透支的时间) 实体6:fetch_depo_log(存款/取款日志)属性: card_type dat amount dep_fet(存款/取款)实体7:payoff_pro(还贷日志)属性:loan_pack_no payback_no payback_amount card_type 二、函数依赖customer_id-name customer_id-trust_abi customer_id-pay_abi card_type-assetcard_type card_no-keyword card_type card_no-fortune_amount card_type card_no-deposite_date loan_pack_no card_type-loan_money loan_pack_no card_type- patoff_date loan_pack_no card_type- borrow-date loan_pack_no card_type-rest_money loan_pack_no card_type-ratecard_type card_no-amount card_type card_no-datescard_type dat -amount dep_fetloan_pack_no payback_no-payback_amount card_type三、E-R图及实体集属性的计算方法Deposite_datecustomerTrust_abinameCustomer_idPay_abiFund_billCard_typeCard_nokeywordFortune_amouttLoan_packLoan_pack_noCard_typeCard_noLoan_moneyrateBorrow_datePayoff_dateRest_moneyoverdraftCard_typeCard_noamountdatePayoff_proPayback_noamountFetch_depo_logDep_fetamountdateFund_billBankCard_typeAssetAddressCustomer部分属性的计算方法:trust_abi:初始为10(最大),然后依据每次所还透支的天数是否超过100天而确定是否减1pay_abimax曾经最大的一次存款额10批注:着重加黑的方框表示弱实体。3.2 表的冗余及外码约束一、表的冗余在还贷日志实体和存取款日志实体中,这两个实体都是弱实体集,故需要连同强实体集的主码一起够成该实体的主码。Loan_pack的主码是card_type loan_pack_no,所以payoff_pro的主码为card_type,loan_pack_no ,payback_no。fund_bill的主码是card_type, card_no故fetch_depo_log的主码为card_type,card_no,fetch_depo_log。二、外码约束参照实体被参照实体实体外码实体外码Fund_billCard_typeBankCard_typeLoan_packCard_typeBankCard_typeOverdraftCard_noFund_billCard_noPayoff_proLoan_pack_noLoan_packLoan_pack_no第四章 逻辑结构设计函数依赖的极小化处理由中的函数依赖及各实体属性得如下函数依赖: customer_id-namecustomer_id-trust_abicustomer_id-pay_abicustomer_id- name,trust_abi,pay_abicard_type card_no-keyword card_type card_no-fortune_amountcard_type card_no-deposite_datecard_type card_no-keyword,fortune_amountdeposite_dateloan_pack_no,card_type- loan_moneyloan_pack_no,card_type- patoff_dateloan_pack_no card_type- borrow-dateloan_pack_no card_type-rest_moneyloan_pack_no card_type-rateloan_pack_no,card_type-loan_money, patoff_dateborrow-date, rest_moneyratecard_type card_no-amountcard_type card_no-datescard_type card_no- amount, dates4.2 E-R图到关系模型及其优化由函数依赖关系及E-R图得关系模型如下:实体集:customer-schema=(customer_id,name,trust_abi,pay_abi)fund_bill-schema=(card_type,card_no,keyword,fortune-amount,date)overdraft-schema-(card_type,card_no,amount,date)bank-schema=(card-type,address,asset)payoff_pro-schema=(loan_pack_no,payback_no,amount,card_type)注:由于payoff_pro是完全参与customer的所以customer与payoff_pro的关系模式可以并作payoff_pro 的实体集模式故payoff_pro-schema=(loan_pack_no,payback_no,amount,card_type,customer_id)loan_packschema(loan_pack_no,card_type,loan_money,payoff_date,borrow_date,rest_money,rate)联系集:customerfundschema(customer_id,card_type,card_no)customer_loanschema(customer_id,loan_pack_no,card_type)函数依赖关系如下图:4.3 工作流程及用户子模式设计一、管理员的工作流程及其子模式:管理员工作界面管理员资料设置银行服务区管理员登录密码修改区新增管理员区删除管理员区银行服务区开设银行银行业务查询开设账户客户业务查询消户二、用户工作流程及子模式设计用户工作界面客户查询区客户存款/取款区客户转账/贷款区用户进入客户密码修改还贷区客户查询区余额查询客户贷款查询客户还贷记录查询第五章 数据库的实施与维护整个数据库的功能展开是以菜单式的呈现给用户:一、功能模块和功能概要管理员工作界面管理员资料设置银行服务密码修改区 功能简单,分析省略新增管理员区 功能简单,分析省略删除管理员区 功能简单,分析省略开设银行 功能简单,分析省略银行业务查询 见分析一开设账户 见分析二客户业务查询 见分析三消户 见分析四以上显示的是各级菜单的关联情况,在管理员资料设置中所用到的只是一些非常单一的SQL语句,不涉及事务性操作。在密码修改区,新增管理员区,删除管理员区只是进行了一些非法数据的屏蔽,和用DELPHI语言调用SQL中的一些更新(UPDATE),插入(INSERT),删除(DELETE)等操作。在开设银行功能中可以添加银行,添加的银行会在下次运行程序的时候出现。另外在消户操作中是通过调用存储过程实现的,用事务实现操作的原子性。在设计上综合了日常银行管理员所常有的一些功能,实现方面主要是在SQL进行事务处理,在DELPHI中是调用存储过程。二、结合源代码和操作界面详细分析分析一、银行业务查询:这一部分主要是供银行管理员查阅当前各个银行有多少储蓄的,所以一些信息对管理员来说是没有必要知道的,也无需知道如银行所在地等。所在这一部分别用了视图,屏蔽掉数据库中的某些内容。视图代码如下:k_viewASSELECT Card_type AS 银行名称, SUM(Asset) AS 总存款额, COUNT(Card_no) AS 总用户数FROM (SELECT Bank.Card_type AS Card_type, Asset, Card_no FROM Bank, Customer_Fund WHERE Bank.Card_type = Customer_Fund.Card_type) DERIVEDTBLGROUP BY Card_type操作界面如下:图1调用视图的程序:(如果选择的是中国农业银行)if(comboBox1.Text=中国农业银行)then begin with ADOQuery1 do begin ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(select * from Bank_view where (银行名称=:a); ADOQuery1.Parameters0.Value:=中国农业银行; ADOQuery1.Open; end; end;选择其他银行的代码如上雷同。其中Bank_view为创建的视图名。分析二、开设账户:功能简介:这一部分是给用户开户的,它可以给一个客户在其指定的银行开一个账户,并生成一个卡号,同时显示该银行卡的初始密码为“888888”。程序在执行时先要对所输入的客户号进行检测,判断该客户是不是已经存在。所以在开始屏蔽掉了输入用户名这一项。如果该用户不存在则显示提示用户输入用户名,对已存在的用户就没有必要存在这一步。需要解决的问题:对已存在客户在新一家银行开户的情况的处理问题。还有给用户随机生成卡号的问题。解决方案:由于开设一个新的账户,需要在多个表中插入数据。故需要进行原子性操作。所以用了事务来处理。由于用户可以在不同的银行都有账户,所以针对一个已经存在的用户,如果再在另外一家银行开设账户的情况处理将不同于新增一个用户然后开设账户的情况。于是针对这两个情况,我分别写了两个存储过程,kaihu1和kaihu2,存储过程的代码如下:Kaihu1Kaihu2create procedure kaihu1 cus_id char(10), name varchar(50), trust_abi int, pay_abi float, Card_type varchar(50), card_no char(13), key char(10), amount float, date datetimeasbegin transactioninsert into customervalues(cus_id,name,trust_abi, pay_abi)if Error0 goto proinsert into Fund_bill values(Card_type,card_no,key,amount,date)if Error0 goto proinsert into customer_Fund values(cus_id,Card_type,card_no)if Error0 goto procommit transactionreturn 0pro:Rollback Transactionreturn 1GOcreate procedure kaihu2 cus_id char(10), Card_type varchar(50), card_no char(13), key char(10), amount float, date datetimeasbegin transactioninsert into customer_Fund values(cus_id,Card_type,card_no)if Error0 goto proinsert into Fund_bill values(Card_type,card_no,key,amount,date)if Error0 goto procommit transactionreturn 0pro:Rollback Transactionreturn 1GO存储过程的分析:对于kaihu1这个存储过程,是在该用户以前不存在的情况下而新开账户所用的存储过程。它要在customer表中插入用户的基本信息,包括初始化用户的信誉度trust_abi10,经济能力pay_abi0。还要在关系表customer_fund中插入客户对应的卡号及卡的类型。还要在fund_bill中插入初始化信息,如用户的密码,存款额fortune_amount,开户日期date等。而kaihu2是在已存在的开户中另外在另一家银行开设账户,该客户的基本信息已有,故相比与kaihu1少了向customer表中插入用户基本信息。其他的类似与kaihu1。对随机生成客户对应卡号问题的解决方案:卡号形式为“字母CK(存款的首字母)+日期+指定位数数据”。在生成字符串时,首先从数据表中查询最大的字符串,利用MAX函数。如果返回为空(NULL),可以将有数字组成的字符串设置为“001”,然后将指定的字符串(如:CK20060220)与之连接组成新的字符串“CK20060220001”;如果返回不为空,如返回“CK20060220034”,则截取字符串的后几位字符,即由数字组成的字符。将其转换为整数,在加1在转换为字符串(如35)。然后判断该字符串占几位,如果占一位,则在前面加“00”,两位加“0”,三位就不加。最后组成新的字符串(CK20060220035).源代码如下:s:=CK+FormatDateTime(yyyymmdd,Now(); with adoquery1 do begin adoquery1.SQL.Clear; adoquery1.SQL.Add(select max(Card_no) as ss from Fund_bill); adoquery1.Open; end; /选择最大的卡号 if(adoquery1.FieldByName(ss).Value=null)then s:=s+001 else begin m:=Trim(adoquery1.fieldByName(ss).Value); i:=strToint(Trim(copy(m,11,5); if i10 then s:=s+00+inttostr(i+1) else if i同行转账加入转账额计算利息下面以数据库中的两组数据展示,这两组数据的原记录如下:转账的工作界面如下:注意卡号为CK20060219002银行的转账后的结果,在数据苦衷显示为:图 11在转账的数据流中,就只有在表中FUND_BILL中有数据的处理,数据没有流出。该操作的关键是怎样模拟现实的转账功能,体现在代码上,就是操作的执行顺序问题。对于贷款功能,主要是贷款号的生成,及根据不同的贷款期限设置不同的利率问题。对于贷款号的生成类似于开户时存款时的卡号生成(详细情况见存款时的卡号生成代码)。而对不同的贷款期限设置不同的贷款利率,也主要是对用户输入的贷款年限的判断,年限越高,利率越大。贷款时的事务操作过程代码如下:事务处理,主要是插入信息对于不同年限设置不同的利率代码:if(strtoint(Edit8.Text)5)then else if strtoint(Edit8.Text)10 then else if strtoint(Edit8.Text)20 then else rate:=0.012;对于贷款另外一个重要的功能是提示用户的最大可贷款额,这是由用户的经济能力决定的,用户经济能力的确定在存款是就已经实现了。那么最大贷款额用户的经济能力曾经最大的一次存款额10该功能的工作界面如下:图12 图13图12图13图 12和图13分别是在贷款期限为4年和10年的时候的贷款情况,如程序所写,他们的利率分别显示为0.006和0.01。分析七、客户还贷区功能简介:还贷需要解决的问题:要能支持分期付款,且每次付款前要算清前一段金额的利息并加到贷款中去。要能知道此次的还贷是第几次还贷。解决措施:还贷操作还应是原子操作,用事物处理。还有在更新贷款信息之前,要查询还贷记录来确定是第几次还贷。该功能实现的存储过程代码如下:查询是第几次还贷的源代码为:查询到次数大于等于1,则这次次数就应该加1查询到还贷次数小于0,表明是第一次还贷下面就分期付款的功能来展示该功能的实现界面:在数据库中有这样的一个账户,该账户的还款记录如下:在贷款项中的记录为:在还款日志中的记录为:如果我们再一次还贷9000元则工作界面显示如下:此时数据库中的记录为:以上流程很好地显示了数据库中的数据的更新情况,在还贷的过程中数据的处理在loan_pack表,数据的查询在payoff_pro表。数据的更新在loan_pack和payoff_pack表中。如果一次性还清,则会消除该账户的贷款记录。DELPHI程序代码也就是对还贷存储过程的调用,一般格式与前面所述的存储过程调用一样,只是参数的传递问题。结束语此次课程设计对于我来说不仅是做了数据库银行管理系统,最为珍贵的是在我准备这次课程设计所学道的以前不为己知的知识。以前较早的便接触到DELPHI只是注重在书本上,从来没有认真的去用DELPHI编写程序,更不用说应用在数据库中。零零散散的学习了一些基本知识,不大实用。通过这次课程设计,我掌握了DELPHI与数据库结合起来编程的一般技术。了解了DELPHI中怎样对数据库进行操作,了解了SQL数据库中的以前不大明白的技术运用。在SQL数据库中,我们把在数据库理论上的知识予以运用,如:建立视图,创建存储过程,应用事务等,在一些基本的数据库操作中,熟悉并巩固了SQL的语法知识。通过对课程设计要求的分析,我们也初步理解一个软件工程的开发流程及发展思路。培养了我们由书面文字要求到转化这种要求到现实模型的能力,即很大程度上培养了我们的建模能力,分析问题,总结归纳问题的能力。这次课程设计也不能说一帆风顺,其中遇到的一个个困难给了我们一次次重新学习,再次思索的机会。我们通过克服这一个个困难,让我们重新又对目前脑子里所掌握的知识进行审理,进行了再次的纠正或者完善,这些都是书本上学不来的。理论联系实际就在这里自然地得到实现。这对我们巩固已学知识,锻炼实践动手能力大有裨益。课程设计能够圆满结束,首先得感谢老师教育我们理论知识,没有这些理论知识就不可能有我们的这次动手实践机会。再一个就要感谢老师利用假期帮助我们,辅导我们,解决课程设计中疑惑与问题。老师的耐心辅导是我们坚持的不懈动力。最后还要感谢在这次课程设计中给予我帮助的同学,谢谢大家!参考文献1 赛奎春 陈紫鸿 宋坤 编著,Delphi数据库开发关键技术与实例应用2 George Schussel, Client/Server: Past, Present and Future, 20003 黄荔, 基于客户/中间服务器/数据库服务器的三层结构, 兵工自动化,2000,(4):15-174 Delphi8实用教程,中国铁道出版社5 The Thin-Client/Server Computing, 6数据库系统概念 Abraham Silberschatz Henry F.Korth S.Sudarshan著,高等教育出版社
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!