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

news2024/11/18 13:31:20

在这里插入图片描述

在高度系统化驱动的业务中,查看业务报表已经是一个很常见的需求了。在分工非常明确的大型企业里,往往有专门的数据分析团队 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.coloradmin.cn/o/1485128.html

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

相关文章

编码器原理图

操作 旋转编码器提供两种交互方式: 每次用户旋转旋钮时,都会在 DT 和 CLK 引脚上产生低电平信号: 顺时针旋转会先使CLK引脚变为低电平,然后DT引脚也变为低电平。 逆时针旋转会使 DT 引脚首先变为低电平,然后 CLK 引脚…

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过,所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式,只有两列,第一列是标签&#…

2024最新外贸建站:WordPress搭建外贸独立站零基础教程

想与外国人做生意有多种方式,一些朋友选择在跨境电商平台上开店如(亚马逊),而另一些朋友则决定建立自己的外贸独立站点。本篇教程主要说的是第二种方式如何快速建立自己的外贸独立站!通过学习这篇外贸建站教程&#xf…

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前,请注意以下免责声明: 侵权问题: 本文提供的信息仅供学习参考,不用做任何商业用途,如造成侵权,请私信我,我会立即删除,作者不对读者因使用本文所述方法…

Beans模块之工厂模块BeanClassLoaderAware

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

DataGrip(IDEA 内置)连接 SQL Server

原文:https://blog.iyatt.com/?p14265 测试环境: IDEA 2023.1SQL Server 2022 首先打开 SQL Server 配置管理工具 启用 TCP/IP 打开 Windows 服务管理 在服务列表中找到 SQL Server(MSSQLSERVER),右键重新启…

【计算机网络通信】计算机之间的局域网通信和互联网通信方法(附Python和C#代码)

文章目录 前言一、局域网通信1.1 基本原理和方法1.1.1 获取本地ip1.1.2 实现局域网内的广播1.1.3 进行局域网通信 1.2 实现多客户端连接1.3 Python源码1.4 C#源码1.5 可能存在的问题 二、互联网通信2.1 实现原理2.1.1 内网穿透软件2.1.2 实现互联网通信 2.2 Python源码2.3 C#源…

腾讯云服务器CVM_云主机_云计算服务器_弹性云服务器

腾讯云服务器CVM提供安全可靠的弹性计算服务,腾讯云明星级云服务器,弹性计算实时扩展或缩减计算资源,支持包年包月、按量计费和竞价实例计费模式,CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格,提供9个9的数…

研发日记,MatlabSimulink开箱报告(九)——Simulink Test模块

文章目录 前言 Simulink Test模块 静态测试 动态测试 逻辑测试 前言 见《开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块》 见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-F…

Canvs的js库:Fabric.js简单强大,用于绘制各种图形

Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API,用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序,例如绘图编辑器、图像编辑器、流程图、地图和数据可视化等。 官网文…

初识C语言—常见关键字

变量的命名最好有意义 名字必须是字母&#xff0c;数字&#xff0c;下划线组成&#xff0c;不能有特殊字符&#xff0c;同时不能以数字开头 变量名不能是关键字 typedef---类型定义&#xff0c;类型重命名 #include <stdio.h>typedef unsigned int uint; //将unsigne…

链表类型题目

文章目录 简介链表的常用技巧两数相加原理代码代码|| 两两交换链表中的节点代码原理 重排链表(重要)原理代码 合并 K 个升序链表代码递归代码 K 个一组翻转链表原理代码 简介 大家好,这里是jiantaoyab,这篇文章给大家带来的是链表相关的题目练习和解析,希望大家能相互讨论进步 …

LCR 152. 验证二叉搜索树的后序遍历序列

解题思路&#xff1a; 分治 public class Solution {// 验证给定的后序遍历数组是否可以来自一个二叉搜索树(BST)public boolean verifyTreeOrder(int[] postorder) {// 调用递归方法来验证整个postorder数组return verify(postorder, 0, postorder.length - 1);}// 递归方法&…

vue2+若依框架plus交互 路由介绍

本周及寒假 参加了校企合作的工程过程管理&#xff0c;和学长学姐一起写项目&#xff0c;之前学了vue也没有应用&#xff0c;然后对框架很多组件的用法不太了解&#xff0c;前期耽误了一些时间。 框架模块 首先是框架模块的介绍 api存了一些系统管理及发送请求的方法 例如p…

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

Vue+SpringBoot打造大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

Redis安全加固策略:服务账号管理 开启redis密码认证 开启防护模式

Redis安全加固策略&#xff1a;服务账号管理 & 开启redis密码认证 & 开启防护模式 1.1 服务账号管理1.1.1 检测方法1.1.2 加固参考配置操作 1.2 开启redis密码认证1.2.1 检测方法1.2.2 加固参考配置操作 1.3 开启防护模式1.3.1 检测方法1.3.2 加固参考配置操作 &#x…

静态时序分析:SDC约束命令set_case_analysis详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定值 指定端口/引脚列表 简单使用 set_case_analysis命令用于对电路进行特定模式的设定&#xff0c;例如对于一个工作在正常模式下的芯片&#xff0c;…

Springboot 项目读取yaml的配置文件信息给静态方法使用,以及通过配置 ResourceBundle 类读取config.properties

读取yaml 的配置文件 配置文件信息 iot_saas_tenement:user_id: 7........8d9bprivate_key: MII.......qQbj_url: http://4.....5:8088project_name: iot_s.......rojectdevice_name: te.....ice 创建一个类 ProxyProperties 读取配置文件信息&#xff0c;并对外提供get方法 …

零基础如何快速入门伦敦金交易

伦敦金交易是金融市场中备受关注的一种投资方式。对于想要学习如何炒伦敦金并快速开始交易的人来说&#xff0c;本文将为您提供一份全面而详细的指南。无论您是初学者还是有经验的交易者&#xff0c;本文都将帮助您了解伦敦金交易的基本知识&#xff0c;并提供一些实用的技巧和…