您的位置:首页 > 数据库 > Mongodb

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”章节的方案。

实施情况,待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息