一、什么是“宽表”?

“宽表”从字面上的意思就是字段(列)比较多的数据库表,是通过关联字段将多个业务主题相关的数据表进行挂接组装为一张大表,实现业务实体不同维度属性信息的统一存储。

例如,开展不动产登记资料查询业务,需要获取权利人、证件号、不动产产权证号、坐落地址、规划用途、房屋性质、建筑面积、抵押登记状态等信息。而在不动产数据库中,上述信息可能分布在购房人信息表、自然幢属性表、户属性表、房地产权属性表、抵押权属表等多个库表中。用户每一次查询都需要在上述的多张数据表中按照关联字段逐一跨表查询,这种操作在数据库中是非常耗时的。

宽表 mysql 宽表数据_数据

                                                        多表关联查询图(模拟数据)

而宽表则是按照不动产登记资料查询业务的需求,提前将相关业务数据表进行抽取、组装,串接为以权利人为实体的一张信息集成表,包含了人、房、地等多元信息,因此不动产登记资料查询只在单表中即可完成。

宽表 mysql 宽表数据_字段_02

                                                               不动产权利人宽表(模拟数据)

可以得到关于宽表的两种解释:

2. 存放核心业务实体不同维度属性的数据库表,可以称之为宽表

3. 存放核心业务实体在业务履行流程中的信息&上下游的关联信息,可以称之为宽表

宽表 mysql 宽表数据_数仓_03

二、为什么要用宽表?

01、宽表查询更便捷

宽表提前处理好多表间的关联,查询人员无需了解数据库表间的关联关系即可实现数据分析,这也避免了进行关联查询时可能出现的逻辑错误。

02、宽表查询效率更高

宽表设计的目的就是为了提高查询的效率,将相关字段都放在同一张数据库表中,避免了大量的关联串接,增加了查询效率。例如:在PG数据库中,1000多万条数据,使用宽表可以提高约25倍查询效率。

宽表 mysql 宽表数据_宽表_04

                                                                        查询效率对比

03、宽表信息更丰富

宽表的设计无需按照数据库三范式进行,而是按照主题或者专题的应用需求,将实体对象相关的指标、维度、属性等各类型的信息都放在同一张表进行存储,通常作为数据仓库中DWS(汇总数据层)。

例如,上文中的不动产权利人宽表,除增加不动产登记数据库中的库表外,还可以根据业务需求,增加租房信息、户籍信息、收入信息等,为后续开展业务查询、在线数据分析(OLAP)、数据分发、数据挖掘等提供基础。

三、宽表存在的问题

01、数据冗余

多表关联生成宽表时,有可能存在一对多的关系,导致产生冗余数据。比如:户表中有面积字段,购房人表和户表通过单元号进行关联时,户表是一对多的关系,那么在宽表中的面积字段就会出现重复,如果直接通过面积字段进行汇总统计就会出错。

宽表 mysql 宽表数据_数据_05

                                                                 宽表冗余

02、维护成本高

多表关联生成宽表后,根据业务场景的变化,宽表中字段可能会出现增减的情况。另外,随着数据更新可能出现业务库表与宽表数据之间出现数据不一致的问题。

四、如何优化宽表?

01、分区表 (Hash分)

在实际的应用中,由于业务数据的不断迭代,宽表可能达到上千万行甚至上亿行,存储压力增加,性能受到极大影响,此时需采用分区表的方式将一个表分成多个小的部分,减小数据冗余带来的存储压力,提高查询吞吐量。

如利用唯一ID、业务主键、行政区划等字段,将数据表拆分为多个子表,从而实现数据在物理上的分区。例如将不动产查询宽表,按照ID序号,拆分为3张数据库表,查询时多个子表同步查询,查询更快,提升宽表查询效率。

宽表 mysql 宽表数据_宽表_06

                                                                                宽表分区

02、索引优化

如果将数据库表比喻为一本书,创建数据库索引就相当于创建书的目录。创建索引能够实现对目标数据的定位,从而到达快速检索的目的。针对宽表应用较多的任意字段组合查询,采用每列独立索引,保障读写性能的均衡。例如,在PG数据库中,针对宽表进行索引创建优化后,性能提升约2倍。

宽表 mysql 宽表数据_字段_07

                                                        索引优化后效率对比

03、使用列式存储

使用列存储(如Hbase)有利于对宽表进行数据压缩,同时可以提升数据读取效率。其原因:一是数据库表中同一列数据类型一致,采用压缩算法可以达到更高的压缩率;二是列存储每次读取的数据是集合的一段或者全部,能够提高读取效率。

五、宽表应用场景

宽表 mysql 宽表数据_宽表 mysql_08

六、如何构建宽表

1、 选取想要构建宽表的业务流程,梳理业务流程中的所有活动;
2、 梳理参与这些活动的核心业务实体;
3、 选择业务最关注的实体来构建宽表;
4、 确定宽表的数据颗粒度;
5、 选取属性
    1、核心实体相关的属性
    2、上下游相关联的核心实体的属性(按需选择)
    3、先关的维度属性(时间、地点、客户、产品等)(按需选择)
    4、统计标签(按需选择)
6、 设计Mapping & 测试用例
7、 实施、测试、上线、回归测试