开源 BI 实践:将表和字段显示成业务术语

将表和字段显示成业务术语

制作语义层

数据库表、字段名通常是英文的,而且常常也是缩写,直接查出来做多维分析不友好,业务用户常常会看不懂。

当然,在写 SQL 时可以用 AS 改成其它名称,例如:

SELECT name AS 姓名, gender AS 性别 FROM employees

但这样每次都要写,临时写一两句 SQL,涉及字段不多时还凑合,否则长期重复在 SQL 中做中英文名称匹配就会比较烦。

润乾 BI 提供 DQL 语义层,可以一次性重定义表名、字段名,然后基于这个语义层提供 DQL 查询服务,DQL 查询语句将使用重定义的 (中文) 名称。下面从 Mysql 的 tpch 库开始创建语义层、部署 DQL 服务、用 DQL 查询数据做多维分析。

打开 DQL 设计器:{润乾报表根目录}/bin/dql.exe,新建一个语义层元数据:

..

在菜单“系统→数据源”里创建 tpch 数据源:

..

然后连接上 tpch 数据源(连接成功后变为粉色):

..

之后就可以直接选择整个数据库的表导入 (系统→导入数据库表):

..

然后对各个表、字段设置中文名称:
..

设置完成后,可以尝试执行 DQL(系统→翻译 DQL),能看到 DQL 被翻译成了带别名的 SQL,并且查询出了数据,这个简单查询语句的语法看起来和 SQL 一样,实际上它是 DQL 语句,以后涉及多表关联查询时,就会看出显著差异,现在先把它当 SQL 用:

..

部署配置 DQL 查询服务

在设计器里完成了语义层元数据的制作,经过测试也能正确执行 DQL 语句了。

下一步把它部署为 DQL 服务,就能用 JDBC 方式给 WEB 端提供 DQL 查询服务了。

{润乾报表安装根目录}/services 下每个文件夹是一个 DQL 服务,默认有 datalogic 服务,我们新建一个 tpch 文件夹,把上面做好的 tpch.lmd 放到 services/tpch/conf 目录下:

..

然后新建这个服务的配置文件 services/tpch/service.xml,指定语义层元数据文件 tpch.lmd,配置原始 Mysql 数据库连接:

<?xml version="1.0" encoding="UTF-8"?>

<SERVICE logicmetadata="tpch.lmd">

 <DB type="MYSQL">

  <CONNECTION name="db1" type="jdbc" url="jdbc:mysql://127.0.0.1:3306/tpch"

   driver="com.mysql.jdbc.Driver" user="root" password="123456"/>

 </DB>

 <USERS>

  <USER name="root" password="root">

   <CONNECTION name="db1"/>

  </USER>

 </USERS>

</SERVICE>

再编辑 DQL Server 的配置文件 services/server.xml,增加 tpch 服务:

..

这样就配置完成了,然后启动 ${润乾报表安装根目录}/bin/startDQLSERVER.bat,看到 datalogic、tpch 两个服务都成功启动了:

..

WEB 端使用 DQL 服务查询数据

在 WEB 的配置文件 {WEB 应用根目录}/WEB-INF/raqsoftConfig.xml 里增加这个 DQL 服务的 JDBC 数据源,连接地址为 jdbc:datalogic://127.0.0.1:3366/tpch,指定了连接 DQL Server 的 tpch 服务,连接的驱动类是 com.datalogic.jdbc.LogicDriver:

……

<DB name="TPCH">

 <property name="url" value="jdbc:datalogic://127.0.0.1:3366/tpch"/>

 <property name="driver" value="com.datalogic.jdbc.LogicDriver"/>

 <property name="type" value="16"/>

 <property name="user" value="root"/>

 <property name="password" value="root"/>

</DB>

……

之后就可以在界面上使用 TPCH 这个数据源做 DQL 查询了,创建一个 DQL 数据集:

..

用这个数据集做个多维分析报表:

..

预定义计算字段

除了可把表名和字段名翻译成业务语外,元数据里还可以预定义计算字段,把基础信息预先加工出更多用于多维分析的信息:

..

在 DQL 里增加成交价格,也查询出来结果了:

..

后记

本篇文章了解了 DQL 语义层的制作、部署以及使用。数据库结构在较长时间里通常比较稳定,通过一次性定义语义层,改善后续长久的查询体验。

但语义层的作用不仅仅是翻译字段名、预定义计算字段,DQL 对表关联的认识方法与 SQL 有本质上的不同,业务人员缺乏技术能力,但借助 DQL 的思维方式,将很大程度提升自己获取数据的能力,多维分析时减少对技术人员的依赖,就会显著提升敏捷性,下篇文章我们继续详细了解。