为什么要在业务系统中引入大宽表?

在这里插入图片描述

在高度系统化驱动的业务中,查看业务报表已经是一个很常见的需求了。在分工非常明确的大型企业里,往往有专门的数据分析团队 BI 或者数据开发团队,他们能够胜任此类需求(但也未必是轻松的,或者说高效的)。

但是,在都是业务开发的中小团队中,业务报表需求,往往就是业务系统的程序员自己进行开发。我不知道这种情况有多普遍,至少在我自己的团队是这样的。业务系统的设计往往是为了实现更强一致性,更高效率,而设计数据库的数据结构。而在这基础上进行报表开发,往往会写出非常复杂的 SQL。

而不同角色的管理者,要求的不同分析视角,使得报表的复用性无法达到理想的程度。开发繁复的报表统计需求,成为了程序员一个无法避免的负担。而在一个“管理信息”集中的系统里,这种矛盾变得尤为凸显。不光是实现这样的需求变得困难和不堪重负,仅仅是保持实现的正确性和高效性,都变得极为困难。

引入大宽表,可以有效降低开发的难度,以及提升代码的复用性。

一、什么是大宽表?

大宽表,顾名思义是一种由单一 key 聚合起来的大量的相关列数据。举个简单的例子,以用户的 ID 为 key,把跟用户相关的所有字段,全部提取出来放到一个单一的表里,每个字段一列,这种就是一个大宽表。

大宽表,我相信这个概念在数据仓库里非常普遍,我也就借由数据仓库的一些基本概念来阐述大宽表的概念。

1. 数据仓库

数据仓库的概念就像表面上的意思,是数据的仓库。不那么显然的是,数据仓库的存在,往往是为了数据分析的需要,也就是我们常说的 OLAP。而业务生产系统往往是为了事务的需求,也就是我们常说的 OLTP 系统,这恐怕也是相对于数据仓库来说的。

将数据从多种不同的业务系统提取,并进行整理后,产生以适应多维度分析的数据结构和格式,是数据仓库这个关键性系统的重要任务之一。

我两度经手管理跟大数据有关的团队,都会看到一个经典的结构图,关于数据仓库的一般性架构的:

经典数仓数据类型架构图

每次我看到图的时候都是一头雾水的:

  • ODS(Operational Data Store)原始数据,业务库表
  • DWD(Data Warehouse Detail)原始数据经过清洗
  • DWS(Data Warehouse Summary)大宽表
  • DM(Data Market/ Marts)数据集市
  • ADS(Application Data Service)应用数据服务

我根本不知道什么意思。括号里写的一些缩写,也只是我网上随便找的,未必就是精确的,至少每个大数据开发,架构师都一套振振有词,虽然他们也未必能说清楚缩写的真实含义。

回来,不管数据仓库到底是什么意思,但是都透露出一个基本的思想,就是业务数据需要经过整理和规范化处理,然后,形成按照特定主题聚合的“成品”数据,方便分析应用更好的使用。

2. 无奈的选择

如果你所在的公司,有一个建制完善的大数据开发团队和对应的数据分析团队,那么恭喜你,你可以从这类的任务中摆脱出来,专注于业务逻辑的开发。否则,应对各种各样的报表需求,也是你不得不接受的任务。

大数据的架构看似美好,但是就跟 OSI 的网络七层模型一样,这是理论中完美,在实操过程中,要应对各式各样的挑战。这也就是我在文章开头说的,即便对于专业的大数据开发团队来说,实现数仓的架构既不是轻松的,也不是高效的。

不过,我在实际业务执行过程中体会到,数据仓库的思想是非常先进的,也有很多的可取之处。比如,根据一个用户的 ID,就可以提取到有关此用户单个人的所有统计信息,然今后再进行简单的聚合,就可以计算出各种想要的分析维度,这难道不美好么?与之相对的,你可能要在系统里联表七八张,然后用复杂的过滤条件,再用复杂的 Group By,最后得到的数据,还需要在代码层再次进行运算,才能得到结果。

数据仓库的数据分层清洗汇总的思想,将很多复杂的运算,在计算层次上进行了抽象和分离,最终实现了计算和统计分离,是一种高效的解耦思想。

我们的所有统计分析在一条复杂 SQL 中出来,这种反倒是将所有东西杂糅在一段代码里进行处理,一个是不方便复用(只能拷贝过去改改),另一个就是不方便调试(很难阅读,也很难比较)。

但是我们又没有足够的人力去把整个数据仓库做出来,形成一个四层结构的 DW。那么这时候,大宽表,就是我们妥协后的一个很好选择,也会成为未来数据仓库构建的一个良好基础。

二、如何设计大宽表

大宽表,实质上,就是一个结构复杂的业务数据表集合,根据单一 key 在二维上一种展开格式。举个例子,用户大宽表,包含 ID,姓名,账号,注册日期,订单数,消费次数,消费总金额,消费平均间隔,消费最高的五个品类,消费的价格区间,等等等各种简单但并不平凡的字段构成。

有了这张宽表,我们可以分析用户的消费能力,消费习惯,活跃程度,流失概率等等各种报表。

1. 归纳法

你的团队应对单个分析需求的时候,往往不会想到要去做个大宽表,因为单个分析需求来的时候,业务往往刚刚起量,我们不可能遇见未来的发展趋势,一般都是直接帮需求方实现了。

但是当类似的需求越来越多的时候,就要警醒,可能业务已经进入腾飞的态势,未来此类分析会越来越多,越来越频繁,而我们需要提供精度越来越高的数据。

这时候,将已经收到并实现过的统计分析需求,进行汇总观察,提炼一个主要的分析 key,并形成宽表设计,就是一个明智的选择。这种方法,我称为归纳法。

2. 字段遴选

哪些字段进入大宽表,哪些不要,这是一个艰难的选择题,我们业务团队自行研发宽表,本来就是一个不得已的选择,意味着我们开发的资源非常有限。不可能无限实现各种字段。

那些明显能够支撑统计需求的字段,必然纳入我们的选择,哪怕是冗余的。这些统计字段都会降低后期分析报表出具的难度。但是有些变化不那么频繁的字段,也可以继续保留主键,而不对值进行展开,这就意味着后期分析的时候,仍然需要联表查询,在数据仓库中,这种往往叫维度表,但是哪些字段可以作为维度表,并不是表面上那么明显,经常是艰难的抉择,这就需要长期业务开发积累的经验。

三、缺点和困难

说了很多优点,缺点和难点却不得不提。

比如,一致性和延迟 就是一个最大的问题。客户是不会容忍你,多少分钟同步一次的。他们只觉得,我在系统里改了数据,我的统计值为什么不变?解决这个问题,就要做好事先需求的沟通和用户教育,对用户做出延迟承诺,比如,XX 数据,在变更后,至多 10 分钟完成各种环境的同步,这就是一种服务承诺。通过这样的方法,在用户心中建立合理的预期。

第二,宽表构建的 依赖和调度的复杂度。比如宽表里的字段,有些在构建时期,就是通过多个关系表,关联起来以后综合计算或者说判断的,在宽表里表达很简单,只是一个字段而已,但是计算过程可能就比较麻烦,有着前后依赖。我举个例子,比如我们用的一个金额列,必须先计算当地支付金额,然后在这个基础上,查询货币兑换的比值(需要用币种和发生时间查表得到),进行外币折算后,才能成为一个有效的金额字段。在进行此类字段的构建时,就出现了依赖的问题,我先要构建第一个字段,然后查询其汇率,才能构建第二个字段。构建时候需要先计算原始币种,发生时间,然后下一步骤才能计算折算金额,有前后依赖问题。

另一个自然想到的问题,是一旦业务数据库发生了变化,这种前后依赖的数据计算,还需要被及时和顺序地调度,这就引发了需要一个强大的依赖管理和任务调度系统。才能有效实现数据宽表的及时更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国电子学会(CEIT)2023年05月真题C语言软件编程等级考试二级(含解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试二级 2023年05月 编程题五道 总分:100分一、数字放大(20分) 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制: 1000 内存限制: 65536 输入 包含三行:第一行为N,…

Stable Diffusion 模型分享:AAM XL (Anime Mix)(动漫截屏风格 XL)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 AAM XL (Anime Mix) 是一个动漫截屏风格的模型,是 AAM - AnyLoRA Anime Mix 模…

【yolov8部署实战】VS2019环境下使用C++和OpenCV环境部署yolo项目|含详细注释源码

一、前言 之前一阵子一直在做的就是怎么把yolo项目部署成c项目,因为项目需要嵌套进yolo模型跑算法。因为自己也是本科生小白一枚,基本上对这方面没有涉猎过,自己一个人从网上到处搜寻资料,写代码,调试,期间…

黑马JavaWeb开发跟学(三)Web前端开发Vue-Element

黑马JavaWeb开发跟学三.Web前端开发Vue-Element 1 Ajax1.1 Ajax介绍1.1.1 Ajax概述1.1.2 Ajax作用1.1.3 同步异步 1.2 原生Ajax1.3 Axios1.3.1 Axios的基本使用1.3.2 Axios快速入门1.3.3 请求方法的别名1.3.4 案例 2 前后台分离开发2.1 前后台分离开发介绍2.2 YAPI2.2.1 YAPI介…

CNN文本分类(tensorflow实现)

前言 实现步骤 1.安装tensorflow2.导入所需要的tensorflow库和其它相关模块3.设置随机种子4.定义模型相关超参数5.加载需要的数据集6.对加载的文本内容进行填充和截断7.构建自己模型8.训练构建的模型9.评估完成的模型 CNN(卷积神经网络)在文本分类任务中…

【GPU驱动开发】-mesa简介

前言 不必害怕未知,无需恐惧犯错,做一个Creator! 一、mesa介绍 Mesa 是一个开源的3D图形库,它实现了多种图形API,包括 OpenGL、Vulkan 和 OpenCL。Mesa 的目标是提供一个开源、跨平台的图形库,使得开发者…

ABAP - SALV教程08 列设置热点及绑定点击事件

实现思路:将列设置成热点,热点列是可点击的,再给SALV实例对象注册点击事件即可,一般作用于点击单号跳转到前台等功能 "设置热点方法METHODS:set_hotspot CHANGING co_alv TYPE REF TO cl_salv_table...."事件处理方法M…

SMART原则

在软件研发领域,项目管理和目标设定尤为关键。一个成功的软件项目不仅需要先进的技术支持,还需要一个清晰、明确且可实现的目标。SMART原则,作为一种高效的目标设定和管理方法,为软件研发提供了有力的指导。SMART是五个英文单词首…

合宙esp32-c3 进入深度睡眠无法唤醒解决一例

手贱,昨天收到了嘉立创最新的esp32 s3,想测试一下电流功耗,于是顺便测试了一下以前的合宙esp32 c3 无串口芯片的版本 打算对比一下c3和s3的功耗相差多少,结果把自己玩死了: void setup() {esp_deep_sleep_start();// esp_light_s…

oppo手机备忘录记录怎么转移到华为手机?

oppo手机备忘录记录怎么转移到华为手机?使用oppo手机已经有三四年了,因为平时习惯,在手机系统的备忘录中记录了很多重要的笔记,比如工作会议的要点、读书笔记、购物清单、朋友的生日提醒等。这些记录对我来说非常重要,我可以通过…

STM32 HAL库 串口使用问题记录

文章目录 STM32 HAL库 串口使用问题记录情况一:串口导致程序假死机情况二:其它程序正常运行,串口不再接收数据 STM32 HAL库 串口使用问题记录 情况一:串口导致程序假死机 多数应该出现在未开启DMA模式使用中断方式接收数据的情况…

钾是人体内重要的电解质之一

钾是人体内重要的电解质之一,是维持细胞生理活动的主要阳离子,在保持机体的正常渗透压及酸碱平衡,维持内环境的稳定性,参与糖及蛋白质代谢,保证神经肌肉的正常功能,在兴奋性等方面具有重要的作用。人体内的…

2000-2021年300+地级市进出口总额数据

2000-2021年300地级市进出口总额数据 1、时间:2000-2021年 2、指标:进出口总额 3、单位:万美元 4、来源:城市年鉴、各省年鉴、城市公报、2021年为城市统计年鉴中进口额出口额加总之后换算成万美元,已尽最大可能进行…

20240303

1.在优势、劣势、机会与威胁(SWOT)的分析期间,团队发现另一个项目通过与该团队合作可能从规模经济中获益。两个项目的成本都可能大幅降低,并可能实现公司的利益,项目经理应该怎么做? A.在风险登记册中记录该发现 B.询问项目发起人的意见 …

1.亿级积分数据分库分表:总体方案设计

项目背景 以一个积分系统为例,积分系统最核心的有积分账户表和积分明细表: 积分账户表:每个用户在一个品牌下有一个积分账户记录,记录了用户的积分余额,数据量在千万级积分明细表:用户每次积分发放、积分扣…

数据结构——Top-k问题

Top-k问题 方法一:堆排序(升序)(时间复杂度O(N*logN))向上调整建堆(时间复杂度:O(N * logN) )向下调整建堆(时间复杂度:O(N) )堆排序代码 方法二&…

LeetCode---386周赛

题目列表 3046. 分割数组 3047. 求交集区域内的最大正方形面积 3048. 标记所有下标的最早秒数 I 3049. 标记所有下标的最早秒数 II 一、分割数组 这题简单的思维题,要想将数组分为两个数组,且分出的两个数组中数字不会重复,很显然一个数…

Redis 的哨兵模式配置

1.配置 vim sentinel.conf# mymaster 给主机起的名字 # 192.168.205.128 主机的ip地址 # 6379 端口号 # 2 当几个哨兵发现主观宕机,则判定为客观宕机。 原则上是大于一半。比如三个哨兵,则设置为 2 sentinel monitor mymaster 192.168.205.128 63…

【动态规划入门】01背包问题

每日一道算法题之01背包问题 一、题目描述二、思路三、C++代码四、结语一、题目描述 题目来源:Acwing 有N件物品和一个容量是 V的背包。每件物品只能使用一次。第 i件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大…

LeetCode题练习与总结:合并K个升序链表

一、题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 二、解题思路 创建一个最小堆(优先队列)来存储所有链表的头节点。这样我们可以始终取出当前所有链表中值最小…