当前位置: 首页 > news >正文

维度建模工具箱 提纲与总结

这里写自定义目录标题

  • 基本概念
    • 事实表和维度表
    • BI(Business Intelligence) 产品
  • 事实表
    • 事实表的粒度
    • 事实表的种类
  • 维度表建模技术
    • 基本原则
      • 避免用自然键作为维度表的主键,而要使用类似自增的整数键
      • 避免过度规范化
      • 避免变成形同事实表的维度表
    • SCD(Slowly Changed Dimension)建模
  • 其它常见规则
  • 结语

这是一本数据仓库、维度建模领域的经典著作,但是也让我觉得枯燥至极。我好久没看到这么枯燥的书了——尤其是这蹩脚的翻译,为阅读增添了不少难度。这本书枯燥的原因(除了垃圾的翻译之外),可能是它太像一本工具书了,前十章都在用一个“尽量简单”的建模例子,引申出建模所要使用的一些技术。然而一般来说这种例子都非常枯燥,不知所云。其次是作者基本没有介绍书中出现的术语,比如“无事实的事实表”,“自然键”等,因此看到这些术语即觉得拗口,也很难快速吸收文字里的知识。如今已经读完这本书一月有余,希望用脑子里还剩下的东西来写一篇博文,说说这本书带给了我什么知识,必要的时候辅以工作中的实际例子来讲解一些术语。这篇文章先会进行背景介绍和基础术语介绍,然后讲解书中提到的基本建模方法。

基本概念

事实表和维度表

数据仓库中的表分为事实表和维度表。事实表一般存储了一系列事件,通常带有一些用以分析的度量(比如金额等数字),而维度表一般存储着一些相互关联的属性。举个最简单的例子,一个订单表是事实表,每一行存储着一次购物行为。而一个订单通常和以下这些“维度”都有关系,比如用户信息,比如物流信息,比如时间信息。

我们知道大数据领域,一般不太遵循SQL那一套规范化,也就是允许行与行之间有很多重复的字段。那为什么数仓里不直接把各种维度直接展开,全放到事实表里,而是要费劲地整一套维度建模理论?

首先,这里讨论的数仓并不只是数据的仓库,而是通常有一些实时查询的需求,下游可以直接从数仓的数据来构建BI报表。也就是整本书讨论的是可以支持BI下游的数仓,而不是一些基于HDFS之类的数仓。有了这一条件,数仓就有性能要求,因此抽取维度表的好处就有:

  1. 降低事实表的列数量,从而大大降低事实表的大小
  2. BI软件通常可以较好地执行一级JOIN,尤其是JOIN KEY为int时。也就是说正常情况下,JOIN维度表的性能较好
  3. 提高列值的标准化程度,在列值转化为维度键的时候会先看维度表中是否已有类似的值,从而避免创建相似但类似的维度(比方说大小写不一样等)

通过上面的一大段阐述,就是为了说明维度建模是很重要、很实用的技术。只有技术有其实用性,接下来才有必要讨论如何更好地进行建模。

BI(Business Intelligence) 产品

经典的BI产品有微软的PowerBI等。BI产品可以方便地搭建动态的可视化报表。比如我们都用Excel画过柱状图、饼图等,这些就是可视化的图形。把这些图形放在一个页面里,可以叫它一个报表。比方说某个商店的报表里可以包含:

  1. 最近卖出最多的十件商品
  2. 卖的最好的十件新品
  3. 退货率最高的十件商品

这样,管理者可以一目了然他/她最关心的一些指标,方便他做出决策。

那什么叫动态报表呢?从我使用BI的经验来看,动态主要体现在两个方面

  1. BI可以定时从数据库里获取最新的数据,从而自动更新报表展示的数值和统计图等
  2. BI支持实时聚合计算,比方说一个大公司的产品会在多个区域进行售卖,管理者可能希望分析四川和浙江畅销商品的差别;产品也分为入门级和高端产品,管理者希望分别看到入门级和高端产品中哪些产品卖的比较好。如此繁多的分析需求,人工一个一个做出报表是费时费力的。而BI产品可以自动地根据某些维度过滤或聚合数据,得到用户想要的答案。这样用户分析的自由度也大大提升了,只要是原始数据里有的维度,都可以进行自助的分类分析。那原始数据里没有的维度该怎么办?让上游提供呗:)

事实表

事实表的粒度

介绍过事实表,和数仓在BI侧的应用,接下来可以讲解事实表的粒度设计。粒度在本书中被通篇强调,因为粒度决定了下游可以进行分析的精细程度。

比方说我们有一个原始订单表,记录了用户的每一个订单,那么订单表可以有两种设计方式,这两种设计方式的粒度不同:

  1. 以订单作为粒度,好比我们在淘宝购物车里一次性买了好几件商品,那么这一次下单,只会在订单表里产生一行事件
  2. 以每个订单的每种商品作为粒度,也就是假如一个订单买了商品1和商品2,那事实表里就会有两条记录

这两种设计的最大区别是什么?从下游应用(下游应用包含BI场景,或者其它分析场景)来看,如果下游希望进行商品维度的分析,那么只有第2种方式能满足。那你可能会说,我把每个订单购买的商品信息存下来不就行了吗?这样会增加分析的复杂程度,毕竟订单和商品是一对多的关系,最终需要一个数组或者更复杂的结构(想想我们不仅关心商品种类,还关心商品购买的数量)来存储。作者虽然不建议在数仓维度建模时进行规范化,但是作者觉得第一范式(也就是每个列不要存储复杂结构如数组、对象等)的底线还是要守住的。

OK,那你可能还会问,如果我要以订单作为分析对象该怎么办?有的分析只能以订单为粒度进行,比方说满减优惠。这时可以给商品订单加上订单维度,用以保存订单的相关信息,比如订单总金额,订单收货地址,订单优惠等。然后订单维度和商品订单事实表以外键关联。

不过一切设计在没有说清楚场景的时候,都很难比较。刚刚的分析是假定需要有很多基于商品的分析,假如情况并非如此,可能结果也不一样。

事实表的种类

事实表有三种基本种类

  1. 事务事实表:也就是通常所说的事实表,每次事件发生时会记录一行(或多行)。比如订单表,每个订单会多一行
  2. 周期快照事实表:通常是将事务事实表以某一周期汇总后进行分析。比如工作中常见的以日为周期、周为周期或者月为周期。按周期汇总可以去除时间不同带来的影响,比方说周末的商品销售量和工作日的一般有很大不同;还可以减少数据量,提高分析的性能。
  3. 累积快照事实表:这一名称非常令人困惑,我觉得叫多步骤事实表可能更直观一些。它通常记录了一系列事件的状态流转过程,比方说一个商品采购事实表,可能需要记录某批次采购的状态,包括合同签订、供应商发货、分发到子仓库等步骤,每个步骤有一些关键维度(比如接收人是谁,接收商品数量、接收金额等)和关键日期。这个表就很适合存储这样的多步骤事实。

那么可能有人会问了,3#看起来就像是把几类不同的事实粘合在一起,能用多个1#类事实表替代吗?
作者提到,SQL的跨行分析能力很差。假如我们希望找出第一阶段和第二阶段之间的时间差大于5天的慢流程,那就需要做一次多事实表JOIN得到临时表,然后再在临时表上做进一步分析。如果某些事实本身就具有3#可应用的模式,那何必强行用1#呢?

事实表还有一些特殊形式,比如

  1. 无事实的事实表:我觉得称它为无度量的事实表更好。这样的事实表中可能没有数字,比如一个用户使用数据表,只记录用户某时某刻使用了App的某一功能。这样的表虽然没有数字,但还属于事实表——或者可以将其看成度量为“1”的事实表,即用户某时某刻使用了某一功能,一次。这个“1”也是可加的,比方说可以用于统计用户当天使用了各个功能次数的分布,找到用户最常使用的功能,因此不要觉得没有度量就不是事实表。
  2. 聚集事实表:我觉得叫聚合事实表更合适。聚集事实表通常在原始表上选择某些维度进行聚合,以达到提高性能的目的。比方说周期快照事实表相当于是在时间维度聚合的聚集事实表。

维度表建模技术

基本原则

避免用自然键作为维度表的主键,而要使用类似自增的整数键

自然键通常指的是维度信息中具有现实意义的某些列,它们能唯一指定维度表中的一行(或者某些行,在需要保留更改记录的情况下)。自然键非常直观,比方说用产品SKU作为商品表的主键,事实表都通过SKU与商品表关联。那么为什么作者建议不要使用自然键作为维度表主键呢?主要原因大概有:

  1. 自然键是从特定的业务背景产生的,使用自然键带来的假设很可能会在未来被违背。比如说商品的SKU可能会被重复利用,当某一商品下架后一段时间,这个SKU就可能代表另一个商品。这样的维度表会给使用者带来很大困惑。
  2. 方便从多个数据源中集成数据,不用考虑多个数据源中自然键的定义是否相同,是否会重复等
  3. 整数的JOIN操作性能很好

避免过度规范化

我们知道在SQL数据库建模领域有第一范式、第二范式、第三范式等。而在数仓建模领域,通常只遵循第一范式,只要每个列都存储基础类型就可以。换个术语来说,数仓领域通常是星型模型(事实表在中央,与一系列维度表关联,就像从一个点发出多条射线一样),而不是雪花模型(事实表在中央与多个维度表关联,维度表还和一系列维度表关联,就像雪花,每个子结构都相似)。

为什么需要避免过度规范化?主要从性能和简单性出发考虑:

  1. 一层JOIN的性能还不错,多层JOIN性能差,不方便进行实时分析
  2. 星型模型只有一层,方便使用者理解

如果有的使用者担心非规范化存储了很多重复值,浪费了很多空间,作者的意见是,维度表的容量相对于事实表少了几个数量级,因此无需在意空间的浪费。

作者在本书中还反复提到了支架表。支架表的想法和雪花模型比较类似,大概就是把维度表中一些重复的属性抽成单独的维度表,并与主维度表关联。作者强调支架表可以用,但是尽量不要用,否则可能是走在过度规范化的路上——作者既然叫它“支架”而不是雪花,说明一般来说主维度也就和另一个副维度相关联。如果关联了好几个副维度,那可就不是支架而是真雪花了。

避免变成形同事实表的维度表

什么时候维度表会形同事实表呢?通常是事实表和维度表都使用了同一主键的时候。比方说一个订单表存储了用户的一次购买行为(以订单为粒度),而设计者觉得应该把订单信息(比如订单号、订单日期、订单金额等我就瞎说一通了)单独放到一个订单维度表里,而事实表里存放订单维度键、用户维度键等。这时会发现,事实表和维度表的行数是相同的。

也就是说,当看到维度表和事实表一样大时,就要觉得有点不对劲了。这两个表实际上是同一个表,因此解决方法是把两个表的字段合一(因为它们粒度相同,主键相同,因此合一不会有任何问题),然后再考虑抽取维度。可以参考第11章-电信中的评审例子来理解这一原则

SCD(Slowly Changed Dimension)建模

第五章主要讲解了SCD建模问题。书中称之为缓慢变化维度,但实际上只关注维度变化的问题,而不只是“缓慢”变化维度。从这一章之后,书中会时不时提到“第二类变化维度”这种词,指的就是第五章介绍的这些SCD建模方法

事件表的修改通常是追加新的事件来增加行数,修改一般也是订正错误的事件,所以一般来说,修改历史事件不太需要很多讨论。但维度表通常会被多个事实表、多行关联,因此维度表的修改要考虑的问题更多。比如说

  1. 当维度表更新时,所有关联事件的维度都会被更新,这是预期的吗?比方说需要让历史数据的维度保持原样,新修改的维度只影响新数据吗?
  2. 维度表更新速度有多快?比方说用户维度表中,包含了一个更新频率很高的字段:“用户积分”,但是其它字段比如用户姓名、城市等几乎不变化。在这种情况下,如果需要记录历史变更记录,那整个维度会因为“用户积分”维度,导致变化很频繁,甚至变化频率都要和事实表不相上下了——这样导致的问题是维度表会记录太多历史数据,过分庞大,而且大部分变化都只针对一个维度,无效存储太多。这时候就要考虑将快速变化的部分从缓慢变化维度中抽离出来

上面大致介绍了变化维度建模需要考虑的事项,接下来介绍具体的建模方法。需要注意从这一章开始

  1. 不变化维度:这算是缓慢变化维度的一种特例:只追加新值,但从不变化。比方说日期表
  2. 直接修改原来的维度行:最暴力,但是会造成所有与之关联的事件,维度都更新,无法保留变更记录
  3. 为每一行加上有效的起止时间,若修改已有的维度行,则会插入新行,并将旧行的截止时间设为新行开始时间(end-time exclusive)。
  4. 添加新列,表示最近几次修改记录:比如一个员工信息表,可以用“上个部门”和“当前部门”两个列来记录变化,通常在只关心最近几次变动的场景下比较实用
  5. 将快速变化部分从缓慢变化维度中抽取出来,同时使用范围值替代确定值:比如刚刚说的用户积分,可以使用用户消费等级这样的维度替代,比如消费0-5000元的为初级用户,10w+的为忠实用户等,避免维度快速变化给维度表带来太多更新。如果需要计算用户的真实积分数值,可以使用周期快照表等方式实现。
  6. 混合以上维度的方法:通常一个维度表中的属性很多,每个属性的特点也不同,因此可以混合以上的处理方法来处理某个维度表。比方说,为了方便起见,有的属性虽然需要保留历史数据,但我们希望还可以快速获取它当前的值,比方说对于员工信息表,我们希望每一行都有当前员工所在部门,和历史时期员工所在部门,我们就可以混合类型1和2建立维度表。每次员工部门变化时,我们既要运用类型2方法插入一行表明当前员工部门变化的数据(并设置旧数据的结束时间),还要把“当前部门”这一列全都刷成最新值。除此之外还有一些混合建模技术,可以通过书来查看。

其它常见规则

这些可以直接看11.2节“设计评审的一般性考虑”和16.9节 “需要避免的常见维度建模错误”,作者做了比较好的总结。

  1. 避免使用原始操作代码或者缩写作为维度属性,要使用人类可读的文本。比方说要用Yes/No(或者True/False,是/否等)来代表是否,而不要使用0/1,或者T/F这样摸棱两可的符号来节约空间。这样是为了让维度值有更好的可读性,而且也方便用户在BI应用上自主地分析数据,而不用跑去问数据源团队这个符号到底是什么意思
  2. 不论事实表或维度表,它们粒度要一致,比方说不要在日精度的表里塞入周汇总或月汇总数据,这样很容易造成统计错误(比如求和、计数)并且让使用者迷惑

结语

工作之后也没有太多时间看书或者写总结,这篇笔记也写得比较粗糙。如果有什么说得不对的或者希望讨论的也可以直接提出来

相关文章:

维度建模工具箱 提纲与总结

这里写自定义目录标题 基本概念事实表和维度表BI(Business Intelligence) 产品 事实表事实表的粒度事实表的种类 维度表建模技术基本原则避免用自然键作为维度表的主键,而要使用类似自增的整数键避免过度规范化避免变成形同事实表的维度表 SCD(Slowly Changed Dimen…...

Vue3 源码解析(六):响应式原理与 reactive

今天这篇文章是笔者会带着大家一起深入剖析 Vue3 的响应式原理实现,以及在响应式基础 API 中的 reactive 是如何实现的。对于 Vue 框架来说,其非侵入的响应式系统是最独特的特性之一了,所以不论任何一个版本的 Vue,在熟悉其基础用…...

规则引擎 - Easy Rules

Easy Rules 依赖demodemo1demo2 总结 Easy Rules 是一个轻量级的 Java 规则引擎,使用简单,适合快速开发和简单的规则场景,适合对于一些判断,是否属于白名单,是否有特殊权限,是否属于当前区域,调…...

uniapp打ios包

uniapp在windows电脑下申请证书并打包上架 前言 该开发笔记记录了在window系统下,在苹果开发者网站生成不同证书,进行uniapp打包调试和上线发布,对window用户友好 注:苹果打包涉及到两种证书:开发证书 和 分发证书 …...

from tensorflow.keras.models import Model中Model报红;以及动态链接库(DLL)初始化例程失败

博主也是网上搜索资料又问的kimi 试了一节课 总结下来: 1、用这句话导入Model from tensorflow.keras.models import Model 2、更新pip pip install --upgrade pip 3、卸载重装tensorflow pip uninstall tensorflow 4、使用阿里云使tensorflow降低到2.8.0&a…...

【初阶数据结构】树——二叉树(上)

文章目录 目录 前言 一、树 1.树的概念与结构 2.树相关术语 3.树的表示 二、二叉树 1.概念与结构 2.特殊的二叉树 3.二叉树存储结构 总结 前言 本篇带大家学习一种非线性数据结构——树,简单认识树和二叉数以及了解二叉树的存储结构。 一、树 1.树的概念与结构 树…...

Debian GNU/Linux的新手入门介绍

Debian GNU/Linux:起源、基本介绍与发行版对比 一、起源与发展历程 Debian GNU/Linux 是现存最古老的 Linux 发行版之一,由 Ian Murdock 于 1993 年 8 月 16 日创立。其名称结合了他的女友(后成为妻子)Debra 和他自己的名字 Ian…...

13 数据存储单位与 C 语言整数类型:从位到艾字节、常见整数类型及其范围、字面量后缀、精确宽度类型详解

1 数据存储单位 在计算机科学领域,数据存储采用分层级的单位体系,各层级单位以 2 的幂次方为换算基础,而非传统数学中的 10 的幂次方。 以下是常见的数据存储单位介绍: 位(bit,b)是计算机中的最…...

【CPU】结合RISC-V CPU架构回答中断系统的7个问题(个人草稿)

结合RISC-V CPU架构对中断系统七个关键问题的详细解析,按照由浅入深的结构进行说明: 一、中断请求机制(问题①) 硬件基础: RISC-V通过CLINT(Core Local Interrupter)和PLIC(Platfor…...

基于unsloth微调一个越狱大模型

网上其实并没有找到现成的开源越狱数据集,所以数据集获取是个麻烦事。想了想easydataset,可能还是不行,easydataset是基于大模型回答的,大模型一般都做了对齐训练,那本地文档生成数据这条路也不可靠。 现成的越狱数据…...

城市客运安全员证适用岗位及要求

城市客运安全员证适用岗位及要求 城市客运安全员证是从事城市公共交通行业安全管理工作的重要资格证书,主要适用于以下岗位: 1. 公交车辆安全员 岗位职责:负责公交车辆运行过程中的安全监督,检查乘客携带物品,防止危…...

UDP协议详解

UDP协议详解 一、理解socket套接字 1.1理解IP ​ 我们都知道在网络中IP用来标识主机的唯一性。那么?这句话该如何理解呢?大家来思考一个问题:计算机之间传输传输数据是目的吗?就好比,你爸叫你给你妈带句话&#xff…...

Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析

摘要 深入剖析 Unreal Engine 中这两个关键组件在赛车游戏方向盘控制中的协同作用,涵盖全流程与实践技巧。 一、引言 在赛车游戏开发中,实现逼真的方向盘控制是提升玩家体验的关键要素之一。而在 Unreal Engine 里,FRotator 与 FQuat 这两…...

第十四届蓝桥杯 2023 C/C++组 飞机降落

目录 题目: 题目描述: ​编辑题目链接: 思路: 核心思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 洛谷 P9241 [蓝桥杯 20…...

完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题

在使用Microsoft Edge浏览器的过程中,我们可能会遇到一些常见的问题,例如无法同步数据或无法更新浏览器。这些问题通常可以归结为以下两个主要原因: 一、网络连接问题 当Edge浏览器无法同步或更新时,首要考虑的是网络连接问题。…...

CSS文本属性

CSS文本属性 在CSS中,可以使用以下属性来设置文本的样式和布局: 1.color : 设置文本颜色。可以使用颜色名称、十六进制值或RGB值来指定颜色: p{color:red; }font-family : 设置文本的字体系列。可以指定一个或多个字…...

思科路由器做DNS服务器

1.实验环境中,常常需要一台DNS服务器来做名称解析,一般会安装一台windows server,启用dns服务,或者安装一台Linux服务器,安装Bind来实现;虽然可以实现你想要的功能,但是费时费力且配置复杂&…...

Windows部署FunASR实时语音听写便捷部署教程

FunASR提供可便捷本地或者云端服务器部署的实时语音听写服务,内核为FunASR已开源的runtime-SDK。 FunASR集成了达摩院语音实验室在Modelscope社区开源的语音端点检测(VAD)、Paraformer-large非流式语音识别(ASR)、Paraformer-large流式语音识别(ASR)、标点预测(PUNC) 等相关能…...

C++之unordered封装

目录 一、哈希表的修改 1.1、哈希表节点结构 1.2、迭代器 1.3、哈希表结构 1.4、完整代码 二、unordered_map的实现 二、unordered_set的实现 一、哈希表的修改 注意:这里我们使用哈希桶来封装unordered_map和unordered_set。 1.1、哈希表节点结构 templa…...

Pycharm(九)函数的闭包、装饰器

目录 一、函数参数 二、闭包 三、装饰器 一、函数参数 def func01():print("func01 shows as follows") func01() # 函数名存放的是函数所在空间的地址 print(func01)#<function func01 at 0x0000023BA9FC04A0> func02func01 print(func02)#<function f…...

7. 栈与队列(随想录)

1.栈实现队列 2.用队列实现栈 3.有效的括号 4.删除字符串中的所有相邻重复项 5.逆波兰表达式 6.滑动窗口最大值 7.前k个高频元素...

GPU软硬件架构协同设计解析

GPU软硬件架构协同设计解析 ​ GPU(图形处理器)的软硬件协同设计是其在通用计算和高性能计算(HPC)领域取得突破的核心原因。以下从硬件架构、软件架构、协同设计的关键技术及典型案例展开深度解析。 一、硬件架构的核心设计原则 流式多处理器(SM)的模块化设计 计算单元…...

【软考】论NoSQL数据库技术及其应用示例

论NoSQL数据库技术及其应用 随着互联网web2.0网站的兴起&#xff0c;传统关系数据库在应对web2.0 网站&#xff0c;特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心&#xff0c;暴露了很多难以克服的问题&#xff0c;而非关系型的数据库则由于其本身的特点得到…...

特伦斯智慧钢琴评测:如何用科技重塑钢琴学习新体验

对于渴望学习钢琴的爱好者而言&#xff0c;传统钢琴的笨重体积、高昂成本与扰民问题往往成为绊脚石。而智能电钢琴的出现&#xff0c;正以轻量化设计、沉浸式体验与智能化功能打破这些壁垒。特伦斯智慧钢琴凭借其专业级硬件配置与创新教学系统&#xff0c;成为市场中兼具性能与…...

UML 状态图:解锁电子图书馆管理系统的高效设计

目录 一、UML 状态图的核心要素 状态&#xff1a;系统行为的 “栖息地” 转换&#xff1a;连接状态的 “桥梁” 动作&#xff1a;赋予功能的 “实践者” 二、电子图书馆管理系统状态图解析 系统空闲状态&#xff1a;一切的起点 读者登录与身份验证&#xff1a;安全的 “…...

UML 状态图:陪伴机器人系统示例

目录 一、状态图的基本概念 1.1 状态 1.2 转换 1.3 动作 二、陪伴机器人系统状态图解析 2.1 初始与待机状态 2.2 情绪检测中状态 2.3 陪伴模式下的细分 2.4 疏导模式的严谨流程 2.5 安抚模式的关键作用 三、状态图绘画 四、UML 状态图的强大 4.1 直观呈现系统行为…...

超详细实现单链表的基础增删改查——基于C语言实现

文章目录 1、链表的概念与分类1.1 链表的概念1.2 链表的分类 2、单链表的结构和定义2.1 单链表的结构2.2 单链表的定义 3、单链表的实现3.1 创建新节点3.2 头插和尾插的实现3.3 头删和尾删的实现3.4 链表的查找3.5 指定位置之前和之后插入数据3.6 删除指定位置的数据和删除指定…...

分布式光纤测温技术让森林火灾预警快人一步

2025年春季&#xff0c;多地接连发生森林火灾&#xff0c;累计过火面积超 3万公顷。春季历来是森林草原火灾易发、多发期&#xff0c;加之清明节已到来&#xff0c;生产生活用火活跃&#xff0c;民俗祭祀用火集中&#xff0c;森林火灾风险进一步加大。森林防火&#xff0c;人人…...

判断链表是否为环(Java版本自己用)

141. 环形链表 核心代码版本&#xff1a; public class Solution {public boolean hasCycle(ListNode head) {if (head null) {return false;}ListNode slow head;ListNode fast head.next;while (fast ! null && fast.next ! null) {if (slow fast) {return true…...

leetcode 516. Longest Palindromic Subsequence

题目描述&#xff1a; 代码&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();//i<j,dp[i][j]表示s[i,j]的最长回文子串的长度,按照这个定义dp[0][n-1]就是答案,i>j的dp[i][j]不定义vector<vector<int>> dp(n,…...

关于敏感文件或备份 安全配置错误 禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件

要禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件&#xff08;如 sc.6abb69d9.css.gz&#xff09;或其他敏感文件&#xff0c;可以通过 Nginx 配置和 Tomcat 配置双重防护来实现。以下是具体解决方案&#xff1a; 方法 1&#xff1a;通过 Nginx 配置禁止访问 .gz 文件 在 N…...

Linux系统启动全流程解析:从BIOS到用户登录

摘要 深度解析Linux系统启动五阶段&#xff1a;内核加载→init进程初始化→系统服务启动→终端创建→用户登录&#xff0c;涵盖SysV/Systemd差异及运行级别管理&#xff0c;提供故障排查指南。 一、启动流程全景概览 Linux系统启动过程严格遵循5个阶段顺序执行&#xff0c;每…...

unity动态骨骼架设+常用参数分享(包含部分穿模解决方案)

Unity骨骼物理模拟插件Dynamic Bone Dynamic Bone 可用于对角色的骨骼&#xff08;bones&#xff09;或者铰链系统&#xff08;joints&#xff09;施加物理效果。 物理效果可以使得游戏角色的头发、衣服、胸部或者是其他的任何部位&#xff0c;都可以以近似真实的状态运动。 …...

【云原生】k8s集群部署最新版ELFK日志采集平台

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Golang开…...

基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——ROS2系统使用说明

前 言 本文主要介绍创龙科技TL3576-MiniEVM评估板演示基于Ubuntu的ROS系统(版本:ROS2 Foxy)使用说明,包括镜像编译、镜像替换,以及ROS系统测试的方法。适用开发环境如下。 Windows开发环境:Windows 10 64bit Linux虚拟机环境:VMware16.2.5、Ubuntu22.04.5 64bit U-B…...

android studio sdk unavailable和Android 安装时报错:SDK emulator directory is missing

md 网上说的都是更换proxy代理什么的&#xff0c;还有一些二其他乱七八糟的&#xff0c;根本没用&#xff0c;感觉很多就是解决不了问题&#xff0c;还贼多贼一致&#xff0c;同质化&#xff0c;感觉很坑人&#xff0c;让人觉得他们和我的一样的&#xff0c;大家都是按他们说的…...

qemu构建arm环境(AI生成)

要编译 qemu-system-arm&#xff0c;你需要安装一些依赖库&#xff0c;配置编译环境&#xff0c;并执行编译过程。以下是一般步骤&#xff0c;适用于大多数基于Linux的系统。 1. 安装依赖 首先&#xff0c;你需要安装一些必要的开发工具和库。你可以使用包管理器来安装这些依…...

10天学会嵌入式技术之51单片机-day-4

第十二章 中断系统 中断系统是单片机用于处理外部紧急事件的一种机制。中断系统工作的大致流程如下 图所示&#xff1a;当 CPU 正在处理某项任务时&#xff0c;外部发生了某个紧急事件&#xff0c;此时 CPU 会暂停当前 的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处…...

spark—SQL3

连接方式 内嵌Hive&#xff1a; 使用时无需额外操作&#xff0c;但实际生产中很少使用。 外部Hive&#xff1a; 在虚拟机下载相关配置文件&#xff0c;在spark-shell中连接需将hive-site.xml拷贝到conf/目录并修改url、将MySQL驱动copy到jars/目录、把core-site.xml和hdfs-sit…...

CENTOS 7 安装VNC

一、VNC简介 VNC&#xff08;Virtual Network Computing&#xff09;&#xff0c;为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络&#xff0c;可发送键盘与鼠标的动作及即时的屏幕画面。 VNC与操作系统无关&#xff0c;因此可跨平台使用&#xff0c;例如可用…...

第42讲:走进智慧农业的“感知神经系统”——农田遥感 + 边缘计算的融合实践

目录 ✨一、为什么要融合遥感与边缘计算? 🧪二、典型应用场景案例 ✅ 案例 1:棉花田的智能水分监测系统 ✅ 案例 2:水稻纹枯病自动识别与预警系统 💻三、关键技术框架与实现思路 🚦 1. 系统架构流程图: 📦 2. 模型部署建议: 💡四、未来发展趋势展望 �…...

Dify忘记管理员密码,重置的问题

今天本地win10电脑&#xff0c;使用源码启动dify&#xff0c;忘记了管理员账号和密码&#xff0c;于是网上查找解决办法。 1.有的网上资料说是去数据库删除用户表&#xff0c;于是进入数据库&#xff1a; docker exec -it docker-db-1 psql -U postgres -d dify 找到postgre…...

C#—Lazy<T> 类型(延迟初始化/懒加载模式)

C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类&#xff0c;用于实现延迟初始化&#xff08;懒加载&#xff09;模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象&#xff0c;直到第一次实际需要时才进行初始化。 主要特点 延迟初始化&#xff1a…...

unity打包安卓时的签名文件jks转换keystore

前言 unity打包安卓时需要的签名文件格式默认是keystore&#xff0c;而有时我们拿到的是jks格式的签名文件&#xff0c;就需要把jks格式文件转换成keystore格式文件。 其实在windows下也可以不转换&#xff0c;在选择签名文件的文件选择框时&#xff0c;把文件扩展名筛选项&a…...

Android audio_policy_configuration.xml加载流程

目录 一、audio_policy_configuration.xml文件被加载流程 1、AudioPolicyService 创建阶段 2、createAudioPolicyManager 实现 3、AudioPolicyManager 构造 4、配置文件解析 loadConfig 5、核心解析逻辑 PolicySerializer::deserialize 二、AudioPolicyConfig类解析 1、…...

AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解

在 Launcher3 执行涉及其他应用窗口&#xff08;即“远程窗口”&#xff09;的动画时&#xff0c;例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画&#xff0c;SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...

iframe下系统访问跨域问题解决办法

问题描述&#xff1a;iframe下嵌入web页面&#xff0c;访问后端接口跨域&#xff0c;导致接口调不通。 产生原因&#xff1a;iframe下&#xff0c;web端访问后端接口时&#xff0c;会优先向后端发送请求方法为OPTIONS的预检测请求&#xff0c;该请求调用不通&#xff0c;导致真…...

Kafka 如何理解Kafka的高可用

一、Kafka高可用核心思想&#xff1a;备胎的自我修养 核心口诀&#xff1a;“别把鸡蛋放在一个篮子里&#xff0c;除非你他妈有100个篮子&#xff01;” Kafka的高可用设计&#xff0c;本质上就是一场**“分布式备胎大战”**。它的核心逻辑是&#xff1a; “老子不信任任何单…...

11-DevOps-Jenkins Pipeline流水线作业

前面已经完成了&#xff0c;通过在Jenkins中创建自由风格的工程&#xff0c;在界面上的配置&#xff0c;完成了发布、构建的过程。 这种方式的缺点就是如果要在另一台机器上进行同样的配置&#xff0c;需要一项一项去填写&#xff0c;不方便迁移&#xff0c;操作比较麻烦。 解…...

C++学习之游戏服务器开发十一DOCKER的基本使用

目录 1.多实例部署方案 2.容器的概念 3.docker初识 4.docker仓库 5.docker镜像 6.docker容器 7.docker和虚拟机的区别 8.docker命令解释 9.dockerfile构建镜像 10.离线分发镜像 1.多实例部署方案 redis 命令&#xff08; redis-cli XXXX &#xff09; set key value:…...