随着我国经济水平的持续发展,金融产品也在不断发展。经中国证监会批准,开放式上市基金已在逐渐发展,为了开展此项业务,招商银行某分行需要一个基金交易平台,以便银行窗口人员在此平台上为广大用户提供基金交易管理的服务,同时为用户提供网上基金交易的便捷服务。该系统的功能分为前台和后台管理。
-
- 后台管理
- 基金管理:添加基金公司、基金公司查询、停用基金公司、添加基金、基金信息查询、停用基金。
- 客户账户管理:活期账户开户、查询活期账户信息、活期账户冻结与解冻、理财账户开户、查询理财账户信息、理财账户冻结与解冻、基金账户冻结与解冻。
- 交易审核:审核基金购买和赎回。
- 前台管理
- 信息查询:基金信息查询、理财资金查询、当日交易查询、未完成交易查询、历史交易查询。
- 委托交易:购买、赎回、撤单。
- 基金账户管理:基金账户开户、基金账户信息查询。
- 理财账户:转账、修改密码。
- 后台管理
分析上面的需求,我们可以得出系统中应该有如下数据表。
系统中基金公司表(FundCompany)字段及说明见表1-1。
表1-1 FundCompany表的字段及说明
字段名称 | 数据类型 | 说明 |
CompanyId | varchar2(20) | 公司ID,主键 |
Name | varchar2(30) | 公司名称 |
Content | clob | 公司简介 |
Money | number(10,2) | 注册资金,单位万元 |
State | number(1,0) | 公司状态,0表示正常,1表示冻结 |
系统中基金表(Fund)字段及说明见表1-2。
表1-2 Fund表的字段及说明
字段名称 | 数据类型 | 说明 |
FundNo | varchar2(20) | 基金代码ID,主键 |
CompanyId | varchar2(20) | 基金公司ID,外键引用FundCompany表的CompanyId |
FundName | varchar2(20) | 基金名称 |
Price | number(10,2) | 基金净值 |
FundType | number(1,0) | 基金类型,1表示开放式,2表示封闭式 |
Invest | number(1,0) | 投资方向,1股票,2债券,3货币,4混合 |
BuyLimit | number(5,0) | 购买下限 |
Ischange | number(1,0) | 是否可转换,0表示不可转换,1表示可转换 |
YearRate | number(6,5) | 年利率,必须是0-1之间的数字 |
ApplyDate | date | 申请日期 |
State | number(1,0) | 基金状态,0表示正常,1表示冻结 |
系统中活期帐户表(CurrentAccount)字段及说明见表1-3。
表1-3 CurrentAccount表的字段及说明
字段名称 | 数据类型 | 说明 |
CurrentAccount | varchar2(20) | 活期帐户账号,主键 |
CurrentPassword | varchar2(20) | 活期帐户密码 |
DepositSum | number(10,2) | 活期账户存款金额 |
CardType | number(1,0) | 证件类型,1为身份证,2为房产证,3为驾驶证 |
CardNo | varchar2(20) | 证件号码 |
Name | varchar2(10) | 开户人姓名 |
Address | varchar2(100) | 家庭地址 |
Phone | varchar2(20) | 电话 |
Sex | number(1,0) | 性别,1表示男,2表示女 |
OpenAccDate | date | 开户日期 |
State | number(1,0) | 帐号状态,1表示不可转帐,0表示可用 |
系统中理财账户表(FinancingAccount)字段及说明见表1-4。
表1-4 FinancingAccount表的字段及说明
字段名称 | 数据类型 | 说明 |
FinancingAccount | varchar2(20) | 理财帐户账号,主键 |
FinancePassWord | varchar2(20) | 理财帐户密码 |
MoneyType | number(1,0) | 货币类型,1表示人民币,2表示美元,3表示欧元 |
AccountBalance | number(10,2) | 理财帐户金额 |
EnableBalance | number(10,2) | 可用余额 |
CongealFund | number(10,2) | 冻结资金,购买基金所对应的资金(未审核) |
State | number(1,0) | 状态,1表示冻结,0表示可用 |
CurrentAccount | varchar2(20) | 活期账户账号,外键引用CurrentAccount表的CurrentAccount |
系统中基金账户表(FundAccount)字段及说明见表1-5。
表1-5 FundAccount表的字段及说明
字段名称 | 数据类型 | 说明 |
FundAccount | varchar2(20) | 基金账户账号,主键 |
FinancingAccount | varchar2(20) | 理财帐户账号,外键引用FinancingAccount表的FinancingAccount |
CompanyID | varchar2(20) | 公司ID,外键引用FundCompany表的CompanyID |
CardType | number(1,0) | 证件类型,1为身份证,2为房产证,3为驾驶证 |
CardNo | varchar2(20) | 证件号码 |
Name | varchar2(10) | 姓名 |
Sex | number(1,0) | 性别,1表示男,0表示女 |
Address | varchar2(100) | 家庭地址 |
Phone | varchar2(20) | 电话 |
PostNum | varchar2(10) | 邮编 |
| varchar2(30) | 电子邮件 |
createDate | date | 开户日期 |
CongealState | number(1,0) | 冻结状态(冻结之后该客户不能购买),0 表示未冻结 ,1 表示冻结 |
系统中购买的基金表(FundBuy)字段及说明见表1-6。
表1-6 FundBuy的字段及说明
字段名称 | 数据类型 | 说明 |
PactNo | varchar2(20) | 合同号,主键 |
FinancingAccount | varchar2(20) | 理财帐户账号,外键引用FinancingAccount表的FinancingAccount |
FundNO | varchar2(20) | 基金账户账号,外键引用Fund表的FundNO |
Fundname | varchar2(20) | 购买基金的名称 |
Fundnumber | number(5,0) | 购买基金的份数 |
BuyDate | date | 购买日期 |
State | number(1,0) | 购买基金的状态,0表示未审核,1表示审核 |
系统中交易表(Trade)字段及说明见表1-7。
表1-7 Trade表的字段及说明
字段名称 | 数据类型 | 说明 |
PactNo | varchar2(20) | 合同号,外键引用FundBuy表PactNo |
FinancingAccount | varchar2(20) | 理财帐户账号,外键引用FinancingAccount表的FinancingAccount |
FundNo | varchar2(20) | 基金编号,外键引用Fund表的FundNO |
FundName | varchar2(20) | 基金名称 |
DealType | number(1,0) | 交易类型,1 表示购买,2 表示撤单,3 表示赎回 |
FundQuotient | number(5,0) | 基金份数 |
BargainPrice | number(10,2) | 成交单价 |
DealMoney | number(10,2) | 交易金额 |
FundAccount | varchar2(20) | 基金账户账号,外键引用FundAccount表的FundAccount |
DealDate | date | 交易日期 |
Status | number(1,0) | 交易状态,0 表示未完成,1 表示完成 |
技术:
- 数据库基础
- 表空间、数据库用户的创建
- 为字段建立约束
- 主键约束
- 检查约束
- 唯一约束
- 默认约束
- 外键约束
- 使用SQL语句
- 使用insert插入数据
- 使用update修改数据
- 使用delete删除数据
- 使用select查询数据
- 使用select联接查询
- 使用Oracle对象
- 使用create sequence 创建序列
- 使用create view 创建视图
- 使用create procedure 创建存储过程
- 使用create function 创建函数
- 编写PL/SQL块
- 使用create trigger 创建触发器
- 使用crate package [body] 创建包和包体
工具:
-
- PL/SQL Developer
开放式基金交易平台(数据库设计)实现阶段划分见表1-8。
表1-8 阶段任务及时间
阶段名称 | 使用时间 | 阶段实现 |
第一阶段 | 60分钟 |
|
第二阶段 | 60分钟 |
|
第三阶段 | 30分钟 |
|
第四阶段 | 60分钟 |
|
第五阶段 | 90分钟 |
|
-
-
- 第一阶段
-
实现:创建表空间,创建用户,创建数据表,添加约束,创建表之间关系。
- 创建表空间fund保存到“D:\”路径下,如下所示。
create tablespace fund datafile 'd:\funddb_file.dbf' size 50M |
- 创建用户test_user 指定默认表空间为fund,如下所示。
create user test_user identified by test123456 default tablespace fund |
- 授予用户角色和权限,如下所示。
grant connect,resource to test_user |
- 使用test_user用户登录Oracle服务器,创建表。
- 创建基金公司表(FundCompany)并添加约束。
- 创建基金表(Fund)并添加约束。
- 创建活期帐户表(CurrentAccount)并添加约束。
- 创建理财账户表(FinancingAccount)并添加约束。
- 创建基金账户表(FundAccount)并添加约束。
- 创建购买的基金表(FundBuy)并添加约束。
- 创建交易表(Trade)并添加约束。
- 建立表之间的外键关系。
- 第二阶段
实现:创建序列分别生成基金公司编号、基金代码、活期账号、理财账号、基金账户、合同号;创建触发器,使用序列,分别实现添加表数据的时候,自动添加基金公司编号、基金代码、活期账号、理财账号、基金账户、合同号;实现基金管理模块。
创建基金管理程序包FundManager_pack,在程序包里创建过程分别实现,添加基金公司、添加基金公司基金、根据公司编号冻结/解冻基金公司、根据基金代码冻结/解冻基金、根据公司编号查询基金公司、根据公司编号查询基金、根据基金代码查询基金。
- 分别创建序列,生成基金公司编号、基金代码、活期账号、理财账号、基金账户、合同号。要求如下:
- 基金公司编号,字母K+5位数字。
- 基金代码,字母V+6位数字。
- 活期账号,13位数字。
- 理财账号,13位数字。
- 基金账户,字母L+5位数字。
- 合同号,字母Z+6位数字。
- 分别创建触发器,在添加表数据的时候,自动添加生成的主键编号。
- 添加基金公司“龙腾集团”,如图1-1所示。
图1-1 添加基金公司
- 根据基金公司添加基金,如图1-2所示。
图1-2 根据基金公司添加基金
- 根据基金公司查询基金信息,如图1-3所示。
图1-3 根据基金公司查询基金
基金公司、基金的冻结/解冻,只需修改基金公司、基金State的状态值(0表示正常,1表示冻结)。
-
-
- 第三阶段
-
实现:基金账户管理、理财账户模块。
创建基金账户管理程序包FundAccountManager_pack,在程序包里创建过程分别实现,基金账户开户、基金账户信息查询。
创建理财账户管理程序包FinancingAccountManager_pack,在程序包里创建过程分别实现,理财账户修改密码、实现转账功能。
- 实现基金账户开户。
- 基金账户的编号不能重复。
- 一个理财账号对同一个公司只能开一个基金账户。
- 实现基金账户信息查询。(查询指定理财帐户所开的所有基金账户的信息)
- 实现理财账户修改密码。(修改理财需要判断原密码是否输入正确,如果正确才能修改)。
- 实现转账功能。
- 转帐分为活期转理财和理财转活期。
- 活期转理财,需要判断活期的资金是否足够,如果不足,就不能进行转帐。
- 活期转理财,需要判断活期密码是否正确,不正确不能转帐。
- 活期转理财,活期转入的金额只加入到总金额和可用余额中。
- 理财转活期,需要判断理财的活动资金是否充足,如果不充足不能进行转帐。
- 理财转活期,需要判断密码是否正确。
- 转帐时需要判断理财/活期是否被冻结。
- 第四阶段
实现:客户账户管理、交易审核模块。
创建客户账户管理程序包ClientAccountManager_pack,在程序包里创建过程分别实现,活期账户开户、查询活期账户信息、活期账户冻结与解冻、理财账户开户、查询理财账户信息、理财账户冻结与解冻、基金账户冻结与解冻。
创建交易审核程序包Auditing_pack,在程序包里创建过程分别实现,审核基金购买、赎回。
- 活期账户开户。(活期帐户账号编号不能重复)
- 查询活期账户信息。(可以根据活期账号精确查询,可以根据姓名模糊查询)
- 活期账户冻结与解冻。(冻结活期帐户时,必须冻结理财帐户,启用活期帐户时,不能启用理财帐户)
- 理财账户开户。
- 一个活期帐户只能开一个理财帐户。
- 活期帐户被冻结不能开理财帐户。
- 活期帐户不存在不能开理财帐户。
- 理财帐户的用户名称应该跟活期帐户的用户名相同。
- 理财帐户的信息不允许进行修改。触发器
- 查询理财账户信息。(可以根据编号精确查询,可以根据姓名模糊查询)
- 理财账户冻结与解冻。(活期帐户被冻结,理财帐户不能被启用)
- 基金账户冻结与解冻。
- 基金账户被冻结不能购买相对应公司的基金。
- 基金公司被冻结,不能解冻基金账户。
- 第五阶段
实现:信息查询、委托交易模块。
创建信息查询程序包Information_pack,在程序包里创建过程分别实现,基金信息查询、理财资金查询、当日交易查询、未完成交易查询、历史交易查询。
创建委托交易程序包Consign_pack,在程序包里创建过程分别实现,基金的购买、赎回、撤单。
- 基金信息查询。(根据理财账号,查询所有购买成功的基金记录)
- 理财资金查询。(根据理财账号,查询理财资金(总金额,可用余额,冻结资金))
- 当日交易查询。(根据理财账号,获取系统时间查询当天的交易记录)
- 未完成交易查询。(根据理财账号,查询所有未完成的交易记录)
- 历史交易查询。(根据理财账号,查询所有交易记录)
- 购买基金。(根据基金账户,购买相应基金公司的基金)
- 购买时判断是否开启所需要购买的基金所对应的公司的基金账户。
- 购买时应判断该公司和该基金是否被冻结。
- 购买时应判断购买下限是否大于购买数量。
- 购买时应判断购买所需资金是否足够。
- 购买时应判断该公司所对应的基金账户是否冻结,冻结了不能基金交易。
- 购买成功后需要扣除交易手续费用,费率0.75%。
- 购买时需要插入一条交易记录。
- 购买成功后,未审核前,购买所需要使用的资金应该在冻结资金中,没有审核前,不能扣去这次交易的手续费用。
- 赎回基金。(根据基金账户,赎回购买的基金)
- 赎回时应该判断该公司和该基金是否被冻结。
- 赎回时应判断所拥有的基金的数量是否大于赎回的数量。
- 赎回时应判断该公司所对应的基金账户是否被冻结,冻结了就不能进行交易。
- 赎回成功后需要交手续费用,费率1.5%。
- 赎回时需要插入一条交易记录。
- 赎回成功后,赎回的基金的数量应该被减去,在冻结资金中应该加入等价的资金。
- 撤单。(根据基金账户,查询购买的基金,撤单是在购买成功后,未审核前,撤单可以把本次交易撤销掉,不能扣去手续费用)
本项目从数据库设计的角度出发,依据前面学习的Oralce数据库知识,设计了开放式基金交易平台的数据库。该项目涵盖的内容比较丰富,涉及到数据库的三类完整性约束,实体间的1:n的联系,n:n的联系等。在项目中使用到了Oracle创建数据库表空间、用户、表、视图、序列、触发器、程序包、存储过程等等。