数仓建模,宽表是什么?如何设计?

article/2025/10/12 0:50:15

数仓建模,宽表是什么?如何设计?

  • 宽表的设计
  • 为什么要建设宽表
  • 宽表的好处和不足
  • 如何设计宽表
  • 总结

宽表的设计

其实宽表是数仓里面非常重要的一块,宽表主要出现在dwd 层报表层,当然有的人说dws 层也有宽表,从字面意义上讲就是字段比较多的数据库表,

通常情况下是将很多相关的数据包括维度表、实时、已有的指标或者是dws/dwd 表关联在一起形成的一张数据表。

由于把不同的内容都放在同一张表存储,宽表已经不符合范式设计的模型设计规范而且数仓里面也不强调范式设计,随之带来的就是数据的大量冗余,与之相对应的好处就是查询性能的提高与便捷

为什么要建设宽表

就像我们前面说过分层的目的是为了管理方便、开发高效、问题定位、节约资源等等,那么我们建设宽表呢?

我们学习建模方法论的时候,提到过维度模型的非强范式的,可以更好的利用大数据处理框架的处理能力,避免范式操作的过多关联操作,可以实现高度的并行化

数据仓库大多数时候是比较适合使用星型模型构建底层数据Hive表,通过大量的冗余来提升查询效率,星型模型对OLAP的分析引擎支持比较友好,这一点在Kylin中比较能体现

可以更好的发挥大数据框架的能力

维度模型可以更好地利用大数据框架,体现在哪里的,体现在数据数据冗余,可以避免很多的关联,怎么体现的呢,宽表。但是这只是站在大数据框架层面上的理解,还有其他层面上的理解。

可以提高开发效率

一般情况下,我们的宽表包含了很多相关的数据,如果我们在宽表的基础上做一些开发,那就很方便,我们直接从宽表里面取数据,避免了我们从头计算,你设想一下你要是没次都从ods开发一张报表,那是多痛苦的体验啊。

可以提高数据质量

宽表的准确性,一般都是经历了时间的检验的,逻辑错误的可能性很小,可以直接使用,要是让你从头开发,那这个过程中可能因为对业务理解不透彻或者是书写的逻辑不正确,导致有数据质量问题

可以统一指标口径

其实这一点和上面一点有点重复,但是这两点的强调的方面是不一样的,因为如果我们的报表要是都能从我们的底层宽表出,那么我们报表上的指标肯定是一样的,其实这一点我相信很多人都深有体会,同一个指标的口径不一致,导致我们提供的数据在不同的出口不一样,是业务部门经常提出的一个问题。其实这也就是我们一直强调的核心逻辑下沉的原因。

宽表的好处和不足

宽表的好处就是我们前面提到过的我们为什么要建设宽表的原因,接下来我们看一下宽表的不足

性能不高

因为我们的宽表的计算逻辑往往很复杂,再加上宽表的数据输入是有大量依赖的,也就是说需要处理的数据量很大,在负载逻辑+大数据量的原因下,导致我们的宽表往往运行很慢,资源占用很多,尤其是重跑的时候。

稳定性不高
在这里插入图片描述
下面的最后一张表就是一张宽表,我们知道一个系统的稳定性是取决于最差的一个环节的,这就是短板理论也叫木桶理论,

我们的宽表的稳定性也是很差的,这个主要是因为我们的宽表依赖太多,每一个表的不稳定性都会传到到宽表。

假设 一张表依赖A,B,C三张表,并且这三张表的稳定性是1/m,1/n,1/x,那么我们的宽表的稳定性就是1/m*n*x,至于表的稳定性你可用它成功运行的次数除于运行的总次数

如果性能不高和稳定性不高同时作用在一件事上的时候我们知道这其实是很致命的,例如你发现报表数据有问题,但是重跑需要几个小时,哈哈!

开发难度大/维护成本高

我们说了基于宽表做报表开发才是正确的姿势,但是宽表本身也是我们开发人员开发的,因为本身的逻辑很复杂设计的业务逻辑繁多,所以给我们的开发就带来了挑战,而且由于业务逻辑的变更我们也需要去维护着复杂的逻辑,例如每次都让你在几千行的SQL 里面加逻辑。

如何设计宽表

宽表的好处和不足我们都讲了,也就是说宽表虽好,但是带来的问题也很多,下面我们就看一下如何从设计的角度来避免宽表的不足之处

宽表到底多宽

开始之前,我们思考一个问题,那就是宽表到底有多宽,就想我们前面讲分层的时候说其实我们不分层也玩得转,早起的数仓就只有一层,现在我们考虑一个问题那就是宽表到底多宽才合适,其实你要把所有的数据装进去也可以。

所以我们要思考到底多宽才合适的,我们与其回答多宽这个问题,不如回答宽表都应该覆盖哪些数据,但是这个问题也不好回答,

但是我们可以反着思考,宽表不应该包含什么数据,这个问题很好回答,宽表不应该包含不属于它所在域的数据例如会员域的宽表只应该包含会员相关的信息,同理我们的宽表是针对某一个域而言的,也就是说它是有边界的

这下我们再来回答宽表到底多宽,只要不跨域,并且方便使用都是合理的。但是这似乎并不能解决我们上面提到的宽表的不足,只是指明了宽表的一个大致的方向。有了方向之后我们通过我们的设计策略就可以让宽表瘦下来。

主次分类

主次分离,其实我们经常听到的一句话就是做事情要搞清楚主次,我们看一下表设计的主次是什么,

假设我们做的是一个会员域的宽表,但是会员域是还是一个比较大的概念,所以我们还要发掘出我们这个表的主题,例如我们做的是一张会员域下的会员基本信息宽表,那么我们专注的肯定就是基本信息,例如会员信息打通。当这样的信息越来越多的时候,我们这张表的主题就越来越弱,所以我们就需要做拆分。

拆分可以让我们更加聚焦表的主题,对于数仓开发人员而言可以更好的维护、对于使用方而言可以更加清楚的理解这张表的主题。

冷热分离

除了前面的主次分离我们还可以做冷热分离,但是怎么看这个事情呢,你想一下你在数据存储的时候是怎么做冷热分离的,这里也是同样的理念。

假设我有一张宽表,里面有200个字段,有30张报表在使用它,但是我发现前面150个经常字段经常被使用,后面 50个字段只有一两张报表使用到了,那么我们就可以做一个冷热分离,将宽表拆分。

稳定与不稳定分离

其实前面的主次分离、冷热分离都可以提高稳定性,但是前面我们不是为了稳定性分离的。

我们经常有这样的宽表,它依赖埋点数据,但是我们的埋点数据的特点就是量大,导致计算经常延迟,那么我们的宽表就会受影响,从而我们的报表就受影响,但是很多时候你发现报表根本没有用过埋点计算出来的指标,或者是只用了一两个。

那我们可以将其拆分,如果报表没有使用到那就最好了,如果使用到了,那就后推,在报表层面上做关联,这样我们的埋点数据即使出不来,我们的报表数据还是可以看的。

总结

主要讲解了一下几个方面

  1. 为什么要建设宽表

  2. 宽表的不足

  3. 如何设计宽表

    • 宽表到底多宽
    • 主次分离
    • 冷热分类
    • 稳定与不稳定分类

http://chatgpt.dhexx.cn/article/vQpVAq67.shtml

相关文章

线性代数笔记22——特征值和特征向量

特征向量 函数通常作用在数字上,比如函数f作用在x上,结果得到了f(x)。在线性代数中,我们将x扩展到多维,对于Ax来说,矩阵A的作用就像一个函数,输入一个向量x,通过A的作用,得到向量Ax。…

特征值和特征向量意义

本文转载自https://blog.csdn.net/fuming2021118535/article/details/51339881,版权问题请联系博主删除 在刚开始学的特征值和特征向量的时候只是知道了定义和式子,并没有理解其内在的含义和应用,这段时间整理了相关的内容,跟大家…

特征值和特征向量的几何含义理解

在刚开始学的特征值和特征向量的时候只是知道了定义和式子,并没有理解其内在的含义和应用,这段时间整理了相关的内容,跟大家分享一下; 首先我们先把特征值和特征向量的定义复习一下: 定义: 设A是n阶矩阵&am…

线性代数之——特征值和特征向量

线性方程 A x b Axb Axb 是稳定状态的问题,特征值在动态问题中有着巨大的重要性。 d u / d t A u du/dtAu du/dtAu 的解随着时间增长、衰减或者震荡,是不能通过消元来求解的。接下来,我们进入线性代数一个新的部分,基于 A x …

特征值和特征向量概述-面试必问3(含特征值、向量意义)

特征值和特征向量(Eigenvalues and eigenvectors) 在线性代数中,一个线性变换的特征向量(eigenvector 或者 characteristic vector)是一个非零向量。将线性变换应用在它上面,它最多以一个标量因子进行伸缩…

java 如何实现深拷贝

1、什么叫Java浅拷贝?  浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型)&…

单例模式之枚举实现

如果你没有学过单例模式,请点击:确保对象的唯一性——单例模式。 有很多网友留言说我漏掉了一种非常重要的Java语言的单例模式实现方式——枚举。^_^ 这篇姗姗来迟的博文将弥补这个“巨大的”缺陷。^_^~~~~~~~~~~~ 在Java语言中,如果综合考虑…

vue实现购物车功能

随着时代发展&#xff0c;网购成了人们必不可少的一部分&#xff0c;所以我们常常遇到要实现购物车功能&#xff0c;如下图&#xff0c;我们来分析一下 下图所示页面: 首先&#xff0c;我们通过ElementUI中的<el-table>标签来实现页面的呈现。 其次&#xff0c;我们可以看…

css实现轮播图

轮播图&#xff1a;就是多张图片按照一定的时间和顺序依次从某个窗口来向用户展示图片 轮播图的实现代码&#xff1a; 1&#xff09;创建一个容器来进行轮播图的展示 这里的容器就是最外部的盒子 注意最外部盒子设置宽高时要与我们进行展示的图片的宽高保持一致&#xff0c…

RabbitMQ实现延迟队列的方式

1.背景 最近在做类似拍卖系统的上架功能&#xff0c;卖家上架物品以后&#xff0c;例如到期时间24小时或者48小时&#xff0c;如果无竞拍者或者购买者&#xff0c;则物品自动下架到用户的邮件中。诸如电商用户下单&#xff0c;30分钟未支付&#xff0c;则自动取消订单&#xff…

接口的实现详解

接口 接口就是定义的规则&#xff0c;规范。 声明类时需要使用的关键字时class&#xff0c;声明接口的关键字时interface&#xff1b; 接口本身就是抽象的&#xff0c;需要一个实现类去实现接口中定义的内容。 接口当中不能定义方法&#xff1a; 接口本身就是抽象的 所在我们…

Qt实现简易计算器

目录 写在前面 一、设计思路 效果展示&#xff1a; 二、功能实现 三、设计代码 1.mainwindow.cpp 2.calculate.cpp 写在前面 上篇文章写了C中如何实现简单的计算器&#xff0c;先用C写看来我的选择是正确的&#xff0c;明白了其中的原理再用Qt实现是水到渠成的事&#…

vue实现复制功能

目录 一、vue实现复制功能 1.功能实现 2.模板结构 3.js行为 4.样式 二.延伸扩展 一、vue实现复制功能 1.功能实现 点击复制弹出复制成功信息&#xff0c;粘贴即可获得复制数据。 2.模板结构 在自己想要复制的内容所在标签上添加一个类名和一个点击事件方法&#xff0c;…

多态的实现

多态实现条件 在Java中要实现多态&#xff0c;那么必须要满足以下几个条件&#xff0c;缺一不可&#xff1a; 必须在继承体系下 子类必须要对父类中的方法进行重写 通过父类的引用调用重写的方法 多态体现&#xff1a;在代码运行时&#xff0c;当传递不同类对象时&#xff0c;…

java实现接口

接口的简述&#xff1a; 1、在java编程语言中&#xff0c;接口是属于抽象类型的&#xff0c;是抽象方法的结合&#xff0c;用interface来定义接口&#xff0c;一个类通过继承接口的方式&#xff0c;从而来继承接口的抽象方法&#xff1b;类可以继承接口&#xff0c;但是接口不可…

java实现链表

一、链表定义 链表通过指针将一组零散的内存块串联在一起进行使用。 数据格式&#xff1a; 根据上面的图展示&#xff0c;每个内存块可以称为链条的一个“结点”&#xff0c;结点包含了数据和下一个结点的地址&#xff1b;同时有2个结点特殊&#xff1a;第一个结点和最后一个…

redis实现延迟队列

前言&#xff1a;redis实现延迟队列该怎么做&#xff1f;在这里我分享一下 redis实现延迟队列 一、Redis实现延迟队列二、redis失效监听事件三、此种实现面临的问题四、开发准备五、基础实现六、使用redisson实现延迟队列七、redisson实现延迟队列的原理八、延迟队列配置九、疑…

如何设置时间格式

如何设置时间格式 开发工具与关键技术&#xff1a;VisualStudio C# 作者&#xff1a;落白 撰写时间&#xff1a;2019/06/26时间格式的转换是一个令人头疼的存在&#xff0c;格式稍微出了一点差错就保存不进数据库&#xff0c;或者在类型为时间类型的input标签中显示不出来。搞…

html如何修改时间,html怎么设置时间

html设置时间的方法&#xff1a;首先创建一个div&#xff1b;然后给该div添加一个class属性&#xff1b;最后通过“function realSysTime(clock){...}”方法设置时间即可。 本文操作环境&#xff1a;windows7系统、HTML5&&CSS3版、Dell G3电脑。 HTML设置一个当前时间s…

心跳检测时间设置

Eureka Client 向 Eureka Server 发送心跳的频率&#xff08;默认 30 秒&#xff09; client eureka:instance:# 如果x秒内&#xff0c;依然没有收到续约请求&#xff0c;判定服务过期,默认90slease-expiration-duration-in-seconds: 50# 每隔x秒钟&#xff0c;向服务中心发送…