利用 DB2 Everyplace 构建移动 CRM 解决方案
2010-03-08 00:00:00 来源:WEB开发网引言
DB2 Everyplace 提供包括嵌入式数据库在内的数据同步整体解决方案,从而为构建移动 CRM 系统提供强大的技术支持。本文首先介绍了 DB2 Everyplace 产品的结构和功能,随后阐述了移动 CRM 系统的体系结构,最后以一个具体实例详细讲述了如何利用 DB2 Everyplace 来开发移动 CRM 系统。
DB2 Everyplace 产品介绍
DB2 Everyplace 是面向个人数字助理 ( PDA ) 和智能电话等移动设备的移动数据解决方案,通过小如指纹的移动数据库以及客户 / 服务器模式的同步解决方案,从而允许企业数据无缝地从后端的业务数据库扩展到移动设备。
DB2 Everyplace 基于三层架构,由下面三部分组成:
移动数据库 ( DB2e Database ) :用于管理和使用移动设备或嵌入式设备上的数据。
同步客户端 ( DB2e Sync Client ) :负责数据在移动数据库与同步服务器之间的同步。
同步服务器 ( Sync Server ):负责管理后台数据库与移动数据库之间的双向数据同步,搭建起连接企业数据源与手持设备移动数据库之间的桥梁。
在图 1 中,我们可以看到应用 DB2 Everyplace 的一个系统模型,上面介绍的三部分分别位于移动设备端和同步服务器端。同步服务器可以看作是移动设备和后台数据库的中间层,它支持多个业界著名的数据库,包括 DB2,Oracle,Microsoft SQL Server 和 Informix 等。
本文是在 Window XP 的环境中使用 DB2 Everyplace ,其版本为 9.1.4 。
图 1. DB2 Everyplace 产品的结构模型
移动 CRM 解决方案的体系架构
移动 CRM 允许企业员工通过移动设备来接入公司的 CRM 系统,能够及时地访问客户的深度数据,包括:基本信息、合同情况、投诉处理、任务日程安排、销售机会跟踪等。通过这些信息,企业员工尤其是销售人员能够全方位地了解到每个客户的特点,为营销活动提供依据,能够为客户提供更加个性化的服务。
对于销售人员来说,移动 CRM 能够为他们及时提供准确的数据,帮助他们更好的完成销售工作;对于公司的管理人员来说,移动 CRM 能够更快收集到销售人员最新的录入数据,这大大节省了后台决策人员的时间,同时反过来也可以将这些反馈回来的数据进行汇总,再次提供给销售人员。这种及时的双向数据沟通大大提高了团队协作效率,从而为公司创造更多的价值。
CRM 系统的移动性得到企业越来越多的关注,很多系统集成商都在现有的 CRM 方案基础上加入了移动性的支持。能否在升级系统以获取移动性支持的同时,还保证对原有系统的改动最小化,是那些已经部署了 CRM 系统的企业在系统升级时的一个重要挑战。
利用 DB2 Everyplace 构建的移动 CRM 系统不仅可以非常方便地使企业后端的 CRM 数据扩展到移动设备端,如 PDA 、智能手机、笔记本等。同时,由于移动 CRM 系统和企业原有 CRM 之间的接口只是后端的 CRM 数据库,因此对原有系统可以做到非常小的改动。移动 CRM 解决方案体系架构如图 2 所示。
图 2. 移动 CRM 解决方案体系架构
在图 2 所示的系统架构图中可以看出,通过作为中间层的同步服务器,可以方便地在移动设备和后台 CRM 数据库之间共享客户管理、商机管理、投诉管理、日程安排、销售管理等信息。通过移动 CRM 系统,销售人员可以通过各种手持设备来访问这些关键数据,为成功营销提供支持,将胜势转变成胜利。
在 Sync Server 端定制数据库表
本章首先介绍在源数据中所涉及到的数据表结构以及表之间的关系,然后介绍如何在 Sync Server 中对这些数据库表进行定制。
建立数据库表以表示客户、客户代表及关联信息
首先,我们假定原有的 CRM 数据库含有客户的基本信息,当然,在实际生产环境中,客户资料将会更加详尽。如下表 1 :
表 1. Client 数据库表
表字段 | 数据类型 | 说明 |
ClientID | Varchar(20), Primary Key | 客户的唯一编号 |
Name | Varchar(20) | 客户姓名 |
Gender | Char | 性别 |
Birthday | Date | 生日 |
Hobby | Varchar(40) | 爱好 |
同样,数据库中还存在客户代表的简单信息,如下表 2 :
表 2. ClientRep 数据库表
表字段 | 数据类型 | 说明 |
RepID | Varchar(20), Primary Key | 客户代表的唯一编号 |
Name | Varchar(20) | 客户代表姓名 |
同时,每位客户代表会负责若干客户,在这里建立一张表格来记录这一对应关系,如下表 3 :
表 3. Relationship 数据库表
表字段 | 数据类型 | 说明 |
RepID | Varchar(20), Primary Key,Foreign Key REFERENCES ClientRep( RepID ) | 客户代表的唯一编号 |
ClientID | Varchar(20), Primary Key,Foreign Key REFERENCES Client( ClientID ) | 客户的唯一编号 |
在这里我们假设公司有两位客户代表 John 和 David 分别负责客户 Jane 和 Diana 。客户代表和所负责客户的关系图如图 3 所示:
图 3. 客户代表和客户的关系图
具体的建表语句和数据插入语句请参见 下载中 CRM.ZIP 中的 CRM.SQL 文件。
在 Sync Server 端创建订阅
DB2 Everyplace 提供了 6 种同步对象,包含了同步过程中各方面的信息,用户可以通过对这些同步对象的配置来完成对同步服务器的配置,以下介绍其中最为常用的 4 种:
用户 (USER):一个用户, 使用 DB2 Everyplace 同步服务器来对源与目标之间的数据执行同步。为一个组指定一个用户,以提供对该组的预定集中定义的预定的访问。在本文所阐述的例子中,新建 2 个用户:REP001 和 REP002 ,分别对应客户代表 John 和 David 。同时在此处也需要为每一个用户设置相应的密码。
组 (GROUP):具有类似移动数据同步需求的用户组 , 对每个组定义同步特征。在本文所阐述的例子中,新建 1 个组:CRM_GROUP 。
预订集 (SUBSCRIPTION SET):预订集合,要为组成员提供对预订中定义的数据和文件的访问,应该将预订收集到一起,放在称为预订集的容器中,然后将此容器对象指定给组。 在本文所阐述的例子中,新建 1 个预定集:CRM_SUBSET 。
预订 (SUBSCRIPTION):一个规范,说明要将源数据库或服务器中的哪些信息复制至目标数据库。 在本文所阐述的例子中,新建 1 个预定: CRM_SUB ,并将 CLIENT 、 CLIENTREP 和 RELATIONSHIP 这 3 个数据库表作为该预定的复制目标。
具体的同步对象配置关系图如图 4 所示:
图 4. 移动 CRM 系统的同步对象关系图
有两种途径可以在同步服务器中创建对 CRM 数据库表的订阅:
1. 通过 MDAC 来进行订阅
MDAC( Mobile Devices Administration Center ,移动设备管理中心 ) 是用于管理 Sync Server 各个功能模块的强大图形工具 , 它允许用户定义用户组要访问的数据和文件的子集。每当用户请求数据同步时 , 同步服务器就会访问此管理信息。
在 Windows 环境下可以通过以下路径进入 MDAC :开始 > 程序 > IBM DB2 Everyplace > Enterprise Edition 9.1 > 管理工具 > 启动移动设备管理中心。
2. 通过编写 XML 脚本文件并运行自带的脚本工具来进行订阅
即利用 DB2 Everyplace 自带的配置工具 dsyadminxml.bat 来将 XML 脚本的配置信息写入到同步服务器的控制数据库中去。
以上介绍了两种在 Sync Server 中创建订阅的方法,本文采用第二种订阅方式。
首先需要编写 XML 脚本文件 ( 命名为 CRM.XML ),以指定同步对象的相关配置信息。通过 CMD 进入命令行,进入 %DB2E_PATH%/Server/bin 路径,可以找到 dsyadminxml.bat 批处理文件,其中 %DB2E_PATH% 指的是 DB2 Everyplace 的安装路径。运行 dsyadminxml.bat -d CRM.XML 便可以将 CRM.XML 中定义的配置信息创建到 Sync Server 中去。
在清单 1 中简单列出 CRM.XML 文件中的大致内容,具体的文件内容请参见 下载中 CRM.ZIP 中的 CRM.XML 文件。
清单 1. 配置脚本 CRM.XML 部分内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Root SYSTEM "file:/com/ibm/mobileservices/xmlscripting/mdas3.dtd">
<Root>
<AddJdbcMaster>
<Database>jdbc:db2:CRM_DB</Database>
<Driver>com.ibm.db2.jcc.DB2Driver</Driver>
<UserId>db2admin</UserId>
<Password>db2admin</Password>
</AddJdbcMaster>
<AddJdbcMirror>
<Database>jdbc:db2:CRM_DB_M</Database>
……
</AddJdbcMirror>
<AddJdbcSubscription>
<Name>CRM_SUB</Name>
……
<MasterDb>jdbc:db2:CRM_DB</MasterDb>
<MasterDriver>com.ibm.db2.jcc.DB2Driver</MasterDriver>
<MirrorDb>jdbc:db2:CRM_DB_M</MirrorDb>
<MirrorDriver>com.ibm.db2.jcc.DB2Driver</MirrorDriver>
<AddTable>
<TargetSchema>CRM</TargetSchema>
<TargetTable>CLIENTREP</TargetTable>
……
<WhereClauseMirrorToMobile></WhereClauseMirrorToMobile>
<WhereClauseMasterToMirror></WhereClauseMasterToMirror>
……
<AddColumn>
<SourceColumn>REPID</SourceColumn>
<TargetColumn>REPID</TargetColumn>
<Subscribe>Y</Subscribe>
<Replicate>Y</Replicate>
<Key>Y</Key>
</AddColumn>
<AddColumn>
<SourceColumn>NAME</SourceColumn>
<TargetColumn>NAME</TargetColumn>
<Subscribe>Y</Subscribe>
<Replicate>Y</Replicate>
<Key>N</Key>
</AddColumn>
</AddTable>
<AddTable>
<TargetSchema>CRM</TargetSchema>
<TargetTable>CLIENT</TargetTable>
……
</AddTable>
<AddTable>
<TargetSchema>CRM</TargetSchema>
…… >
</AddTable>
</AddJdbcSubscription>
<AddSubscriptionSet>
<Name>CRM_SUBSET</Name>
<IncludeSubscription>
<Name>CRM_SUB</Name>
</IncludeSubscription>
</AddSubscriptionSet>
<AddGroup>
<Name>CRM_GROUP</Name>
<Enabled>Y</Enabled>
<IncludeSubscriptionSet>
<Name>CRM_SUBSET</Name>
</IncludeSubscriptionSet>
</AddGroup>
<AddUser>
<Name>REP001</Name>
<UserGroup>CRM_GROUP</UserGroup>
<Password>111</Password>
</AddUser>
<AddUser>
<Name>REP002</Name>
<UserGroup>CRM_GROUP</UserGroup>
<Password>111</Password>
</AddUser>
</Root>
从清单 1 可以看出,在根节点 Root 下共有以下几种节点: AddJdbcMaster 、 AddJdbcMirror 、 AddJdbcSubscription 、 AddSubscriptionSet 、 AddGroup 和 AddUser 。接下来分别加以解释。
节点 AddJdbcMaster 用以添加源数据库 ( 在本文中为 CRM_DB ) 的信息,包括数据库的 URL ,所用连接 Driver ,用户名和密码。同样, AddJdbcMirror 用以添加镜像数据库 ( 在本文中为 CRM_DB_M ) 的信息。
节点 AddSubscriptionSet 定义了预定集信息 ( CRM_SUBSET ),会使用到 AddJdbcSubscription 中的预定信息。
节点 AddJdbcSubscription 包含了一个预定 ( CRM_SUB ) 的重要信息:订阅的表格属于哪个源数据库、关联的镜像数据库信息,并且通过 AddTable 来订阅源数据库中的具体表格 ( Client 、 ClientRep 和 Relationship )。每一个 AddTable 节点添加一个数据库表,并对其进行具体配置,在这里会用到节点 AddJdbcMaster 和 AddJdbcMirror 提供的数据库连接信息。
节点 AddGroup 包含了一个组所需要的信息 ( CRM_GROUP ),会使用到 AddSubscriptionSet 中的预定集信息。
节点 AddUser 包含了用户信息 ( REP001 和 REP002 ),包括用户名、密码,以及属于哪个组。
利用 Filter 功能来保证数据私密性
在客户关系管理中,数据的私密性需要得到严格的保证。每个客户代表只拥有自己所负责的客户数据的操作权限,而不应该查看到其他客户代表所负责的客户数据。比如上文提到的客户代表 John 专门负责与客户 Jane 相关的各项事宜,他可以对 Jane 的资料进行查询和增删改,但却不能够查看到 Diana 的数据;同样的, David 也只能查看到 Diana 的数据,而不能够看到 Jane 的数据。
在 DB2 Everyplace 中提供了数据过滤 ( Data Filter ) 功能,可以很好的支持移动 CRM 系统数据私密性的需求。我们可以简单地将过滤功能看成是同步服务器提供的一个视图的功能,它能使移动用户只能访问到他能够访问到的数据,从而保证了数据的安全性和私密性。
在 DB2 Everyplace 中,数据同步是双向的,但数据过滤却只能是单向的:只对从后台数据库到移动数据库的数据进行过滤。可以看出数据过滤可以分成两阶段:从源数据库到同步服务器的镜像数据库,以及从镜像数据库到移动数据库。前者将不需要让所有移动用户得知的数据过滤掉;而后者针对特定移动用户进行特定的过滤定制。
数据过滤包括垂直过滤 ( Vertical Filter ) 和水平过滤 ( Horizontal Filter ) 。当不希望用户访问到某些列的信息时,可以通过垂直过滤将这些列进行屏蔽;当不希望用户访问到某些数据行集时,可以通过水平过滤将这些具体的行集进行过滤。
既然不同的移动用户 REP001( John ) 和 REP002( David ) 会访问数据库表中的不同数据,因此我们通过从镜像数据库到移动数据库的水平过滤来实现数据过滤功能。
建立水平过滤的步骤
找到每个用户在数据库中的唯一标识。如本文的客户代表 John 和 David ,他们在数据库中的唯一标识是 ClientRep 表中的主键 RepId ,分别是 REP001 和 REP002 。
同步服务器 ( Sync Server ) 的组 ( GROUP ) 对象中定义一个变量用以区别不同用户。本文定义了变量 :REP ,并且赋予初始值 'REP001' 。
在同步服务器 ( Sync Server ) 的用户 ( USER ) 对象中,针对每一个用户赋予不同的变量值。本文的 REP001 用户的 :REP 值为 'REP001' , REP002 用户的 :REP 值为 'REP002' 。当移动用户和同步服务器进行通信时,同步服务器便可以得知当前会话 :REP 的具体值。
在数据库中找到那些需要进行过滤的表。如果这些表中的数据含有用户的标识信息,也就是步骤 1 所示主键的外键,则可以直接选出外键的值与步骤 3 所得到的变量值相同的记录。如本文的 ClientRep 表和 Relationship 表都含有 RepId 这一列。如果表中不含有步骤 1 的外键,则必然存在一个或者多个中间表,这些中间表指明了数据过滤的表中的数据与用户表示的对应关系,可以通过这样的关系来选出属于特定用户的数据。如本文的 Client 表,并不含有 RepId 列,但是通过 Relationship 表,可以得知哪些 Client 数据属于哪些用户。
在同步服务器 ( Sync Server ) 的预定 ( SUBSCRIPTION ) 对象中,对那些需要进行数据过滤的数据库表进行配置。根据步骤 4 的信息对数据库表添加相应的 where 语句。在本文中,对于 CLIENTREP 和 Relationship 表,加入的 where 语句为 REPID = :REP ;对于 Client 表,加入的 where 语句为 CLIENTID IN ( SELECT CLIENTID FROM CRM.Relationship WHERE REPID = :REP ) 。
接下来介绍具体的 Filter 设置方法。在进行数据库订阅的配置时已经介绍过存在两种方式来对同步服务器的同步信息进行设置,在进行 Filter 设置时也可以通过这两种方式中的其中一种来进行相关配置。
通过 MDAC 来进行更新订阅配置
在 GROUP 层定义变量
组 -> CRM_GROUP -> 编辑 -> 数据过滤器
添加 :REP ( 变量名需要以冒号作为第一个字符 ),缺省值 'REP001' ( 字符串要用单引号括起来 )
在 USER 层对变量进行赋值
用户 -> REP001 -> 编辑 -> 数据过滤器
更改:双击参数 :REP ,输入 'REP001' 来覆盖默认值
用户 -> REP002 -> 编辑 -> 数据过滤器
更改:双击参数 :REP ,输入 'REP002' 来覆盖默认值
在 SUBSCRIPTION 层定义过滤条件
预定 -> CRM_SUB -> 编辑 -> 标识 -> 定义预定
选中 CLIENT -> 高级 -> 行 -> 个别用户的行的子集,输入 CLIENTID IN (SELECT CLIENTID FROM CRM.Relationship WHERE REPID=:REP)
选中 CLIENTREP -> 高级 -> 行 -> 个别用户的行的子集,输入 REPID=:REP
选中 RELATIONSHIP -> 高级 -> 行 -> 个别用户的行的子集,输入 REPID=:REP
通过编写 XML 脚本文件并运行自带的脚本工具来更新订阅配置
首先需要编写脚本,这里命名为 CRM_REMOVE.XML ,来将原有的订阅控制信息删除掉。具体命令与创建预定时类似,运行 dsyadminxml.bat -d CRM_REMOVE.XML 即可。
然后编写新的订阅脚本 CRM_FILTER.XML 来重新配置订阅设置。设置成功后,同步服务器便会根据不用的用户选择不同的数据子集来进行同步,从而保证用户只能访问到有访问权限的数据,对于他人的秘密数据将不会被同步到移动设备上来。
CMR_FILTER.XML 在 CRM.XML 文件的基础上进行以下修改,加入一些过滤语句,形成了带有过滤功能的订阅脚本文件。
找到 TargetTable 是 CLIENTREP 的 AddTable 元素,在 WhereClauseMirrorToMobile 元素中加入语句 REPID = :REP ,如清单 2 所示。
找到 TargetTable 是 RELATIONSHIP 的 AddTable 元素,在 WhereClauseMirrorToMobile 元素中加入语句 REPID = :REP 。
找到 TargetTable 是 CLIENT 的 AddTable 元素,在 WhereClauseMirrorToMobile 元素中加入语句 CLIENTID IN ( SELECT CLIENTID FROM CRM.Relationship WHERE REPID = :REP ) 。
具体的预定删除脚本文件和带有 Filter 的预定创建脚本文件请参见 下载中 CRM.ZIP 中的 CRM_REMOVE.XML 和 CRM_FILTER.XML 文件。
清单 2. CMR_FILTER.XML 脚本文件片段
<AddTable>
<TargetSchema>CRM</TargetSchema>
<TargetTable>CLIENTREP</TargetTable>
<SourceSchema>CRM</SourceSchema>
<SourceTable>CLIENTREP</SourceTable>
<DeleteAuth>Y</DeleteAuth>
<InsertAuth>Y</InsertAuth>
<UpdateAuth>Y</UpdateAuth>
<SelectAuth>Y</SelectAuth>
<WhereClauseMirrorToMobile>REPID=:REP</WhereClauseMirrorToMobile>
<WhereClauseMasterToMirror></WhereClauseMasterToMirror>
<JoinFilter>G</JoinFilter>
<Order>2</Order>
<Encrypt>N</Encrypt>
<AddColumn>
<SourceColumn>REPID</SourceColumn>
<TargetColumn>REPID</TargetColumn>
<Subscribe>Y</Subscribe>
<Replicate>Y</Replicate>
<Key>Y</Key>
</AddColumn>
<AddColumn>
<SourceColumn>NAME</SourceColumn>
<TargetColumn>NAME</TargetColumn>
<Subscribe>Y</Subscribe>
<Replicate>Y</Replicate>
<Key>N</Key>
</AddColumn>
</AddTable>
将数据从源数据库复制到镜像数据库
现在我们已经成功地在源数据库 ( 也就是 CRM 数据库 ) 中创建了 Client 等 3 张数据库表,并插入了业务数据;在 Sync Server 端成功进行了配置,订阅了源数据库中的业务表,并创建了两个同步用户。为了使移动客户端能够同步到源数据库中的数据,还需要在 Sync Server 端执行复制命令。
在这里先简单介绍一下镜像数据库的概念。在 DB2 Everyplace 产品架构中,并不是每一次移动设备与 Sync Server 进行同步都会访问源数据库,而是利用镜像数据库来进行同步数据的存储。只有当发出复制命令时,Sync Server 才会进行冲突数据处理,并和源数据库进行双向数据复制,这样减少了对源数据库的访问,减轻源数据库的负载。
在 %DB2e_PATH%\Server\bin 目录下可以找到复制工具 dsyreplicate.bat ,将镜像数据库 CRM_DB_M 作为参数,运行 dsyreplicate.bat CRM_DB_M 命令就会在源数据库和 Sync Server 所管理的镜像数据库 CRM_DB_M 之间进行数据的双向复制。
利用移动客户端程序来同步数据
DB2 Everyplace 的移动端支持多种硬件平台 ( 包括 ARM 、X86 、XSCALE 等 ) 和操作系统 ( 包括 linux 、neutrino 、palmos 、symbian7 、symbian7s 、win32 、wince 等 )。在安装父目录的子目录 Clients 下可以找到针对不同移动设备的移动数据库引擎和 Sync Client 的 API 文件。
从移动设备的设置信息 ( 见图 5 ) 中可以看出,本文采用的移动设备的操作系统为 WinCE 5 ,处理器为 ARM,因此在 DB2 Everyplace 的相应目录中找到同步所需要的文件包,复制到移动设备上点击安装。所需的文件列表如表 4 所示。
图 5. 移动设备的操作系统、处理器信息
表 4. 需要安装在移动设备上的 cab 文件
路径 | 文件 | 说明 |
%DB2e_PATH%\Clients\wince\database\en_US\install | sampwce502.armv4t.CAB | 英文版的 DB2e CLP 程序 |
%DB2e_PATH%\Clients\wince\database\\install | db2ev502.armv4t.CAB | DB2e 数据库引擎 |
%DB2e_PATH%\Clients\wince\sync\en_US\install | syncv502.armv4t.CAB | DB2e Sync Client 引擎 |
安装完毕之后,在移动设备中会生成两个新的目录 DB2 Everyplace SyncServer 和 DB2 Everyplace Samples ,前者包含移动设备端的同步程序 db2sync.exe ,后者包含 DB2e 数据库的命令行工具 DB2eCLP.exe 。
在这里,我们模拟客户代表 John 登录移动设备,展示如何进行同步并查看数据的过程。在利用同步程序同步之前,需要进行相应的参数设置,包括 URL 、User 、Password 和 Target Path ,如图 6 所示。其中 URL 指的是同步服务器的 IP 和端口号;User 是系统分配给 John 的用户名,在 “在 Sync Server 端定制数据库表” 一节中可以得知是 REP001 ;Password 需要填入在同步服务器中定义用户时所设置的密码;Target Path 指定了同步下来的数据将存放于 data 目录下。
图 6. 移动设备的同步设置
在填写完同步设置之后,点击同步就可以开始同步过程。很快,就可以看到同步成功的提示信息。接下来,我们利用 DB2eCLP.exe 来查看同步下来的数据。输入 select * from client 查询命令后,就可以看到如图 7 所示的查询结果。从中我们可以看出,同步下来的 Client 表中的数据只包含 ( CLIENT001 , Jane , F , 1983-11-02, Swimming ) 一条数据。同理,我们可以查询 Clientrep 和 Relationship 这两张数据库表中的数据,在此就不再赘述。
图 7. 数据查询结果
至此,我们成功的在 Sync Server 端订阅了数据库 CRM_DB 中 Client 等 3 张表;利用 Filter 功能来保证客户代表所访问数据的私密性;随后在移动设备端安装同步所需要的文件;最后进行一次成功的同步,并通过 DB2eCLP 工具验证了同步到移动设备上的数据。
结束语
DB2 Everyplace 是 IBM 公司的一款优秀的移动数据库中间件产品,它为无线数据应用开发提供了强大的支持。本文介绍了如何利用 DB2 Everyplace 来构建移动 CRM 系统,并从客户端和服务器端详细介绍了这个系统的实现方法。
本文示例源代码或素材下载
Tags:利用 DB Everyplace
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接