MongoDB 与关系型数据库(Oracle)关联统计实践方案

1. 前言

本实践方案是基于业务流程应用平台,流程流转及审批数据存储在关系型数据库中,申请单/审批单文档存储在MongoDB中。

有统计需求,统计表含关系型数据库和MongoDB两者内容,如下表所示。

MongoDB 与关系型数据库(Oracle)关联统计实践方案_第1张图片

上述表单内容含义:是对业务全景简明描述。

2. 设计方案

2.1. 基于MongoDB查询统计

业务统计基于MongoDB数据源,对于缺少的流程数据,在流程结束时,更新流程相关信息到MongoDB数据库中。

如果涉及到流程实时数据的查询、统计,因为在途流程数据相对较少,可以采用基于MongoDB查询结果集合中在办的单子,按文档ID到Oracle 数据中查询流程和待办任务数据。

例如:第1章节中的表,有“流程状态”字段,此状态需要到Oracle中流程待办任务中获取,设计时序图如下。

Created with Raphaël 2.1.0 查询界面 查询界面 C_EXPENSES C_EXPENSES MongoDB MongoDB Oracle Oracle 1.查询 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”工具。

MongoDB 与关系型数据库(Oracle)关联统计实践方案_第2张图片
返回结果如下(删除掉部分关键信息):

<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_EXPENSES C_EXPENSES Oracle Oracle MongoDB MongoDB 1.查询 2.查询未提取数据列表 3.按列表逐条提取数据 4.解析JSON数据 5.向附加表插入数据 6.查询展现数据 7.获取附表数据 8.构造界面数据列表

3. 选择方案及实施

通过上文简明分析,初步结论是采用“2.1”章节的方案。

实施情况,待续……

你可能感兴趣的:(oracle,mongodb,数据库,webservice,业务流程)