MongoDB 与关系型数据库(Oracle)关联统计实践方案
2016-03-13 21:33
791 查看
1. 前言
本实践方案是基于业务流程应用平台,流程流转及审批数据存储在关系型数据库中,申请单/审批单文档存储在MongoDB中。有统计需求,统计表含关系型数据库和MongoDB两者内容,如下表所示。
上述表单内容含义:是对业务全景简明描述。
2. 设计方案
2.1. 基于MongoDB查询统计
业务统计基于MongoDB数据源,对于缺少的流程数据,在流程结束时,更新流程相关信息到MongoDB数据库中。如果涉及到流程实时数据的查询、统计,因为在途流程数据相对较少,可以采用基于MongoDB查询结果集合中在办的单子,按文档ID到Oracle 数据中查询流程和待办任务数据。
例如:第1章节中的表,有“流程状态”字段,此状态需要到Oracle中流程待办任务中获取,设计时序图如下。
Created with Raphaël 2.1.0查询界面查询界面C_EXPENSESC_EXPENSESMongoDBMongoDBOracleOracle1.查询2.按条件查询获列表数据3.解析JSON数据4.按文档ID查询未结束流程流转状态和待办人5.解析并组合数据6.返回查询展现数据7.构造界面数据列表
2.1.1. 增加追加MongoDB文档状态Webservice
此Webservice配置到流程结束环节入口。如果不要查询文档流转状态,则可以不配置此服务,不必增加系统负担。
在文档中追加key为”STATUS”。
2.1.2. 增加按MongoDB文档”_ID“查询Oracle数据库流程待办信息的Webservice
按批量方式处理,调用一次Webservice。2.2. 基于关系型数据库查询统计
此方案是基于早期关系型数据库逻辑,把MongoDB做为文档,从MongoDB中提取关键统计信息项目到关系型数据库相关附表中,再进行统计。下表为系统中业务流程实例主表。
create table BIZ_INFO_INSTANCE ( BIZ_INSTANCEID VARCHAR2(50) not null, BIZ_RVSN_NUMBER VARCHAR2(50) not null, INFO_ID VARCHAR2(50) not null, WKFL_ID VARCHAR2(50) not null, MONGO_BO_ID VARCHAR2(50) not null, BO_TITLE VARCHAR2(500) not null, MONGO_ATTACH_IDS VARCHAR2(500), WKFL_NAME VARCHAR2(500), REMINDER_COUNT INTEGER, BPM_PROCESS_INSTANCE VARCHAR2(50), CREATEBY VARCHAR2(50) not null, DEPT_ID VARCHAR2(50) not null, COMPANY_ID VARCHAR2(50) not null, STATUS INTEGER not null, START_DATE DATE, END_DATE DATE, EXPIREDTIME_HR INTEGER, EXPIRED_DELAY_HR INTEGER, TENANT_DN VARCHAR2(150), ...... )
新建附加表,用于存储从MongoDB中提取查询统计数据。
create table BIZ_INFO_INSTANCE_EXPENSES ( BIZ_INSTANCEID VARCHAR2(50) not null, /* 流程实例ID */ BIZ_RVSN_NUMBER VARCHAR2(50) not null, /* 业务定义编号*/ INFO_ID VARCHAR2(50) not null, /* 业务定义ID */ MONGO_BO_ID VARCHAR2(50) not null, BO_TITLE VARCHAR2(500) not null, COMPANY_ID VARCHAR2(50) not null, SCHEMENAME VARCHAR2(500), /* 方案名称 */ TARGETCUSTOMER VARCHAR2(500), /* 目标客户 */ STANDARD_TYPE VARCHAR2(500), /* 申请类型 */ BEGAINTIME VARCHAR2(20), /* 方案开始时间 */ OVSERTIME VARCHAR2(20), /* 方案结束时间 */ EXPENCES_TYPE VARCHAR2(500), /* 资费类型(ZF_TYPE) */ SALE_PRICE VARCHAR2(500), /* 给客户的价格(GKHDJG) */ DISCOUNT VARCHAR2(500), /* 折扣(ZK) */ NEWTIME VARCHAR2(20), /* 资费申请时间 */ BUSINESSTYPE_L1 VARCHAR2(500), /* 业务类别_一级(YIJI) */ BUSINESSTYPE_L2 VARCHAR2(500), /* 业务类别_二级(ERJI) */ APPLICANT VARCHAR2(500), /* 申请人(SDEPT) */ TENANT_DN VARCHAR2(150), EXT1 VARCHAR2(500), EXT2 VARCHAR2(500), EXT3 VARCHAR2(500), EXT4 VARCHAR2(500), EXT5 VARCHAR2(500), constraint PK_BIZ_INFO_INSTANCE_EXPENSES primary key (BIZ_INSTANCEID) )
获取数据使用现有Webservice —— FindMongoById。
验证测试脚本
select * from biz_info_instance t where t.biz_instanceid = '875f0269-64ff-11e5-fcea-fde22e8156b4'
获取如下内容:
MongoDB数据集合名称,为表中BIZ_RVSN_NUMBER字段数据,内容为“ZFSP”;
MongoDB数据记录中“_ID”,为表中MONGO_BO_ID自读数据,内容为“56e26e8c84ae8c6dfbdad008”;
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Body> <FindMongoById xmlns="http://unicom.com/common/attachment" preserveSpace="no" qAccess="0" qValues=""> <oid>56e26e8c84ae8c6dfbdad008</oid> <collection>ZFSP</collection> </FindMongoById> </SOAP:Body> </SOAP:Envelope>
使用“Test Webservice Tools”工具。
返回结果如下(删除掉部分关键信息):
<data> <FindMongoByIdResponse xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://unicom.com/common/attachment" preserveSpace="no" qAccess="0" qValues=""> <tuple> <old> <findMongoById> <findMongoById>{ "_id" : { "$oid" : "56e26e8c84ae8c6dfbdad008"} , "schemeName" : "ESS侧固话单产品资费" , "beginTime" : "2016-03-30" , "overTime" : "2050-12-30" , "dk" : "" , "BZZF" : "" , "GKHDJG" : "" , "zk" : "" , "autoNo" : "S**20160001" , "outTime" : "2050-12-30" , "sdept" : "***分公司市场营销部" , "newTime" : "2016-03-11" , "developmentGoals" : "6万户" , "Income" : "年增量180万元" , "stockIncome" : "0" , "ARPU" : "5" , "tariffExecutionNumber" : "" , "ZQKH" : false , "SWKH" : false , "JYKH" : false , "JIATKH" : true , "GRKH" : true , "zf_Type" : "固话" , "standard_Type" : "地市延期" , "imposed" : "全部地区" , "description" : "针对光改平移纯语音固话公众用户,......" , "promotionalReasons" : "针对光改平移固话纯语音公众用户,推广......" , "comparisonOfCompetition" : "无" , "exclusiveProducts" : "无" , "anticipatedTarget" : "6万户固话纯语音公众用户" , "priorCondition" : "无" , "overallSituation" : "年增量收入测算,......" , "countermeasures" : "预发展用户均为光改平移老用户,固话......" , "possibleRisk" : "无" , "datetimePicker" : "2016-03-11" , "yiji" : "\\\"0\\\"" , "erji" : "\\\"0\\\"" , "opinoin" : [ { "prop0" : "流程申请表" , "prop1" : "周**" , "prop2" : "同意" , "prop3" : "2016-03-11 15:21:01"}]}</findMongoById> </findMongoById> </old> </tuple> </FindMongoByIdResponse> </data>
查询MongoDB数据Webservice源生代码如下:
// MongoDb通过ID查询的方法 public static String findMongoById(String oid, String collection) { // 获取指定的collection DBCollection coll = MongoDBUtil.getCollection(collection); BasicDBObject queryCondition = new BasicDBObject(); queryCondition.put("_id", new ObjectId(oid)); DBObject returnValue = coll.findOne(queryCondition); String value = ""; if (returnValue != null) { if (returnValue.toMap().size() > 0) { value = returnValue.toString(); } else { value = ""; } } else { value = ""; } return value; }
Created with Raphaël 2.1.0查询界面查询界面C_EXPENSESC_EXPENSESOracleOracleMongoDBMongoDB1.查询2.查询未提取数据列表3.按列表逐条提取数据4.解析JSON数据5.向附加表插入数据6.查询展现数据7.获取附表数据8.构造界面数据列表
3. 选择方案及实施
通过上文简明分析,初步结论是采用“2.1”章节的方案。实施情况,待续……
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- Android之获取手机上的图片和视频缩略图thumbnails
- 如何在 Fedora 上安装 MongoDB 服务器
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- 数据库链接字符串查询网站
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- 如何在 Ubuntu 上安装 MongoDB
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- DB2实例管理
- DB2实例管理
- OS block size和Oracle block size,查找OS Blocksize的方法