00:01
好,大家好,我是穆远,然后目前是就职于个推数据研发岗位,嗯,在个推任职期间呢,先后参与了公司内部的数据仓库建设,包括数据中台建设,那今天很高兴和大家一起交流分享数据仓库相关的一些知识。这次分享呢,主要从以下这六个部分展开。首先第一个。嗯,我们先看一下什么是数据仓库,第二部分呢,是我们为什么要建数据仓库,或者是说我们何时需要去建数据仓库。那第三部分我们如何去建设一个数据仓库,数据仓库建设数据仓库有什么样的方法论?那第四部分呢,主要我们回顾一下呃算式建模,因为如呃如果大家学过那个呃数据库相关的概论的话,呃应该应该对方式建模有一定的了解。
01:14
呃,第五部分呢,我们会介绍一下,着重介绍一下维度建模这一块的内容,最后我们会以一个呃,简单的案例来呃。来应用使使用维度建模,嗯,去做一个简单的应用。好,我们看一下第一部分,什么是数据仓库。那我们先看一下数据仓库的发展历史,呃,数据仓库呢,经过了以下这四个阶段,有出呃萌芽阶段,探索阶段,出行阶段,确立阶段,首先我们看一下萌芽阶段,呃萌芽阶段其实也是苏仓提出的一个背景啊。呃,在萌芽阶段,提出将业务处理系统和分析系统分开,针对各自不同的特点设计不同的架构。
02:09
那我们知道,呃,业务处理系统,就我们常见的业务系统是提供数据,是由数据库提供数据的,那分析系统其实就是我们这里讲的数数据仓库,我们数据仓库就是为分析系统提供数据支持。那最后我们再看一下确立阶段,呃,在数仓。这一块有一个叫emo的大神,然后他出版了一本叫呃,构建数据仓库的书。然后在里面呃,对数据仓库的定义做了一个做了一个,呃,确定。那我们看一下数据仓库,Emo对数据仓库的定义是怎么样的?
03:03
首先提出数据仓库是一个面向主题集成的、相对稳定的、反映历史变化的一个数据集合。用于支持管理决策,首先呢,呃,数据仓库是一个数据集合。然后它有四个特性。是面向主题集成的相对稳定的,反应历史变化的,那他最终目的呢,是用于支持管理决策,首先我们一个一个特性来看啊,面向主题,呃,首先主题指的是用户进行分析决策时所关心的重点的一个方面。那面向主题呢,就是数据按照主题域进行组织。那举个例子,在我们电商业务里面,呃有比如说你想分析呃商品的上下架的一个情况可以呃创建一个商品域,然后比如说想分析用户的一个研究用户呃分析用户的新增活跃等等情况可以呃划分一个用户主题语,包括还有其他比如说像交易域,呃就是用户在呃。
04:25
购买商品交易的过程中去分析的一些呃场景,那第二部分呢是呃集成。那集成表示的是数据是来自于就数据仓库里面的数据啊,是来自于分散的操作系统型的业务数据。那数据仓库作为我们整个公司的一个数据中心啊,他的数据都是来自于各个业务系统,然后通过呃。一定的数据处理,嗯,进行做一定的加工集成,然后呃,存储到我们数据仓库。
05:05
那第四部分就是数据仓库,是一个相对稳定的呃,数据集合,也就是说呢,数据仓库里面的数据啊,基本上是呃不更新的,主要是提供数据的一个查询。那第四个特性呢,就是反映历史变化的啊,数据仓库里面的数据啊,它是呃存储呃历史的所有数据,那么呃如果需要计算历史的一些呃指标啊,或者是呃业务需求啊可以。就可以用得到。好,我们来看一下,呃,除了emo提供呃定义了一个呃给了一个数据仓库的定义以外呢,那有一另外一个大神叫kimber,他也嗯给了一个数仓的一个定义,嗯,他给的定义是数据仓库是一个将原系统数据抽取清洗。
06:13
呃呃,规范化,然后提交到维度数据存储的一个系统,为决策制定提为决策的制定提供查询和分析的能力。那我们从呃这两位呃大神提出的这个数仓的定义可以看出啊,就前者emo提出的,其实是从数仓的一个整体的一个特性,从整体的视角来看,就是数仓应该具有哪什么样的特性,那后者呢,就是kimber呢,它是从这个数仓建设的实施流程来定义的,呃。那其实我们真正建设素商的过程中啊,其实就是啊,按kber定义的流程来建设,但是建设好的素商呢,其实是满足呃O的定义的四个特性啊。
07:12
并且啊呃这两位他呃针对呃树上的建设,提供了不同的建设的一个方法论,那后面我们会看到具体怎么实施。第二部分是我们为什么要建立数据仓库?那其实就是说我们核实需要建数据仓库,那以下我列了三点,首先第一点呃,如果想要集中化的管理数据,解决数据孤岛,或者是想要使用呃大数据去驱动业务,借助大数据的力量来提升产品的竞争力。
08:00
那第三个呢,是希望以更高效的方式使用数据,首先前两个数据仓库作为整个公司的一个数据中心啊。数据来自于多个业务系统,集成至多方的数据充分利用,那第三第三点呢,是在大数据量的场景下,需要借助大数据平台来高效的处理数据,根据分析需求按一定的方式组织数据,以提高数据的使用。那数据仓库又怎么建设呢?首先我们呃在前面看到数据仓库它的定义里面是数据仓库是一个数据集合,也就是说存储的是数据集合,那么为了数据使用更加高效,需要对呃数据的呃存储。
09:01
进行一定的存储设计,那这种设计呢,就叫数据建模。哎,我们先看一下数据建模的定义啊,数据建模是数据组织存储的方法,它强调从业务以及数据的存储和使用的角度合理的存储数据,那一个好的数据模型啊,它有这四个好处啊,第一个是性能方面,它可以快速查询所需要的数据,减少数据的IO吞吐,第二方面呢,是从成本方面考虑啊,一个好的模型啊,可以减少不必要的数据冗余,也可以实现呃计算结果的复用以极大的。降低存储和计算的成本。第三个方面是效率方面,一个好的模型呢,可以极大的改善用户使用的数据体验,提高使用数据的效率。
10:02
简单来说就是用户使用起来更方便,不需要去做呃各种呃,比如说像关联操作啊等等一些复杂的操作,那第四方面是质量方面,一个好的模型可以改,改善数据统计的口径不一致的问题啊,减少数据计算错误的可能性,那在大数据的系统。需要数据模型方法来帮助更好的组织和存储数据,使得以上这四个呃性能,包括成本和效率和质量之间取得一个最佳的平衡点。那举个例子,比如说我们让数据冗余。那用户数据冗余呢?那用户使用起来就比较简单,不需要去做复杂的一些关联操作,所以数据冗余它其实是可以提升这个用户使用的效率的。
11:04
并且因为他不需要做一些复杂的操作,所以他对查询查询的性能方面也是有提升的。并且降低了计算的成本,但是呢,因为你数据冗余了,所以在成本方面,呃,存储方面的成本是提升了,并且你一份数据存了,嗯,因为数据冗余存了多个地方,所以可能在数据不一致的方面,他数据不一致的问题,可能这样这个问题的风险就会增加,所以在质量方面可能就会稍微有有一些降低。那所以我们呃,去建议去设计模型的时候,需要考虑这性能,成本,效率,质量这四个方面去找到一个平衡点。
12:05
那数据呃。数据建模其实有两种常常用的一个建模方法,第一种呢是放式建模,第二种是维度建模,那方式建模就是前面emo提的一个。建模方法,那kimber提的建模方法就是维度建模方式。建模是站在企业角度面向主题的一个抽象,并不是针对某个具体的业务流程的一个实体对象的关系的一个抽象,它的特点呢,主要是要求建模人员需要全面的了解业务和数据,并且整个实施过程呢会比较长,对建模人员的能力要求也是比较高的。那维度建模就是针对具体的业务流程的。
13:02
一个实体关系的一个抽象,从分析决策的需求出发构建模型为分析需求服务,因此它重点关注用户如何更加快速的完成需求,同时具有比较好的一个查询的一个性能。那放式建模呢,里面有呃,液压模型,液压模型就是将。呃,事物抽象为实体属性关系来表示数据关联和事物描述的。那维度建模里面有两种模型,一种是新型模型,一种是雪花模型。星型模型呢,是由一个四时表和一组维度表组成,40表居中,多个维度表呢呈辐射状分布在四周。并且与40表连接,形成一个心形状。而雪花是在新型模型的基础上,基于放肆理论进一步城市化。
14:04
最终形成雪花状的一个结构。好,那我们提到了两种建模方法,但是呃。具体我们选择哪种?选择哪一种模型去构建我们设计我们的数仓的数据,数据模型其实是需要根据我们不同的场景或者是不同的系统来选择。首先我们看一下呃,Oltp和o lap。这两种两种类型的系统,OLTP系统呢是呃,全称是连接事物处理。它是面向随机读写的数据操作,呃关注事物的处理,比如说我们传统的关系型数据库,它就属于OLTP的一个系统,那像在这种系统上去呃建设我们的数据仓库呢,主要是采用呃我们方式建模里面的ER模型来做呃设计,从而在事物处理中解决数据的冗余和一致性的问题。
15:19
那么如果是o lap系统,那op全称是连接分析处理,它是一个面向批量读写数据操作。不关注事物处理一致性,主要是关注数据的整合以及大数据查询和处理中的一个性能,比如说像我们常见的have、麒麟、ina和clickhouse等等。这些是属于o lap的。系统,像op系统呢,在上面去创,去建设我们的数据仓库,一般就是采用维度建模的方法。
16:07
好,第四部分我们先呃带大家回顾一下呃,范式建模。范式建模主要呃回顾两个部分,第一部分是ER实体关系模型,第二部分是范式,我们主要呃回顾一下123范式。ER模型什么是ER模型?在我们信息系统中啊,将事物抽象为实体属性关系来表示数据关联和事物,这种对数据的抽象建模的方法就叫ER实体关系模型。所谓实体,通常指的是参与到过程中的主体。举个例子,比如说电商业务,那其实里面有商品,有用户,有有店铺等等,它这些是属于。
17:10
属于实体,那属性呢,是对实体的一个描述。和修饰。比如说商品实体。它是有,呃,比如说商品名称,颜色尺寸。等等一些属性。那第三部分是关系,关系指的是现实的物理事件,它是依附于实体。比如说用户购买商品的事件。但是依附于实体用户和商品的,但是呃,这个关系呢,他也是有属性的,比如说你。呃,用户购买商品它有,呃,购买数量包括购买金额,这就是他的一个。
18:08
守信。那实体之间呢,呃,也是有呃三种关系啊。有一对一和一对多,多对多的关系,一对一,比如说呃,实体。呃,实体人。和身份证他是一个一对一的一个关系,那一对多,比如说学生和班级都是一个实体,那一个学生他属于一个班级,但是一个班级里面可以有多个学生,所以他是一个一对多的啊,多对一其实跟一对多是一样的。啊,多对多的关系呢,比如说实体学生和课程。两个实体他们之间的关系,比如说一个学生他可以选多门课程,那一门课程呢,也可以被多个学学生选修,所以他们之间是多对多的一个关系。
19:12
在我们日常建模过程中啊,需要梳理实体关系属性,并且画出相应的液压图,那实体呢,我们一般在液压图里面是使用矩形来表示。那关系使用菱形属,属性呢?是用椭圆形表示。我们前面介绍了一下基本概念,那么放式建模的,呃,放式模型设计的四个步骤,呃,首先第一个是抽象出主体,第二个是梳理主体之间的一个关系,然后梳理主体的属性,最后画出图。我们先看一个案例。
20:00
比如有这么一个场景啊,是课程管理系统,那么这个系统主要用来管理某学校的个教师学生。和课程。嗯。其中呢,包括课程选修,嗯,考试嗯,教师授课,学生班级管理功能,现在需要完成数据库的一个逻辑模型设计。那按照我们前面讲的,呃,模型设计的四个步骤,首先第一步梳理出实体。那从上面的一个描述啊,我们可以看到实体主要有,呃,教师,课程,学生和班级,那关系呢?有教师讲授课程,呃学生和课程的关系是可以是选修啊,也可以是比如说考试,考试有呃考试分数啊,学生和班级是学生隶属于某个班级。
21:06
那第三步是呃,梳理实体的一个属性。那比如说学生有呃。姓名啊,等等其他年龄等等其他属性啊,第四步是画出图。那我们以学生选修课程为例啊,看一下这个A图是是怎么样的。那首先学生和课程是一个实体,所以他们用矩形表示。那关系呢,他们是选修关系啊,用菱形表示,那学生有学生ID,姓名,性别等等,还有其他属性。那呃课程还有课程ID,课程名称,包括呃所属的门类,这是课程的属性。
22:00
嗯,那么关系它也有属性,比如说呃,学生选修课程的,呃,总课时,选修时间等等其他属性。那画出液压图以后啊,就可以根据呃液压图去设计对应的数据表。那比如说像这个图,呃,学生的数据表。课程,课程与学生之间的关系也是一个数据表。当然还有教师和课程的一个。教师。和班级。嗯,那ERER模型,呃,就是包括ER模型的一个定义啊,包括呃。设计的步骤啊,就是按这么一个步骤来设计啊,第二部分呢,我们讲一下上市,上市是设计模型时啊,遵从不同的规范要求,设计出合理的模型,那这些不同的规范要求就被称为不同的范式。
23:11
越高的方式呢,它数据库的冗余越小,但是计算却越复杂。那数据库的方式,呃,主要有以下几类,有一放式,二放式,三放式,呃,比如说还有呃五放式六放式。80克的方式,那么放式越高,数据库冗余越小,计算就越复杂,所以我们需要找到一个平衡点,一般业界呢,普遍是使用三放式,那三放式既保证了一定的灵活度啊,它又降低了呃数据处理复杂度,保证了处理数据的一个速度。那下面我们介绍一下123放式,首先一放式它的定义呢,是符合一放式的关系中每个属性都是不可分割的,比如说下面这张图。
24:11
那比如说我们设计的呃,表是有这么几个字段,那么进货和销售。其实呃,比如说进货可以拆成数量和单价,比如说销售又可以拆成数量和单价,那么他进货和销售这两个呃属性啊,它是可以呃分割的,所以呢,上面的这种设计啊,它就不属于一方式的要求。那只有把它们呃拆开以后,像下面这张图。那就属于一方式的一个要求。那一方是会存在以下这几个问题啊。嗯,有数据冗余大,插入异常,删除异常,修改异常,这是四个问题,举个例子。
25:05
啊,我们下面有一张学生分数表的一张图,它有呃,学号姓名,姓名系主任,包括课名分数这几个属性。那它是属于一放式,那它存在的问题是第一个数据冗余过大,那比如说像这里的姓名啊,系主任,包括呃姓名他都是有非常多的重复。那第二个是插入异常,比如说学校需要新建一个系,但是还没有招收学生,那这个时候是没有办法把这个姓名和系主任写到这张表里面的,因为我们这张表啊,其实是学生分数表,主要记录的是嗯,学生与分数。那第第三个是删除异常。那比如说我们将某个系的所有学生记录都删除了,那么这个戏其实在这种表中也就随之消失了。
26:08
那所以这就存在了删除异常,那第四个是修改异常。比如呃,李晓明,他现在是属于经济系。那如果他转到了法律系。那这个时候呢?就需要在我们这张表里面去修改三条数据。那所以它会呃,一放式里面就会存在这四个问题。那么二方式它的方式比较高。嗯,它是在一放式的基础上消除了非主属性对马的部分函数依赖,这里的马其实就是我们通常意义上的呃主件,非主属性呢,就是嗯,除了组件以外的其他属性。
27:01
那比如说我们刚刚那张学生分数表。那其实他学生分数表的这个组件是学号和课名,因为只有学号和课名才可以确确定他的分数。那么姓名,姓名其实只需要依赖于序号。所以呢,呃,它是部分依赖于这个马的,因为我们学生分数表的马是学号加课课名,他学姓名只依赖于学号,所以是部分你来包括姓名,姓名也只依赖于学号,因为你确定了一个学生的学号以后,你其实就能确定他是属于哪个系的。那包括系主任也是部分依赖。那所以在二方式里面去消除,需要消除部分依赖。那么就像右边这张图。
28:01
啊,将它拆成两张表。嗯,看一下。拆完后的呃,数据向右图。那这种呃在二方式里面消除了部分依赖以后啊,它在针对一放式的四个问题之上,在数据冗余和呃修改方面有有所改进,像数据冗余他姓名。他没有像一放里面,呃,冗余这么多了,包括系名和系主任。在数据领域方面,就没有像一方式那么多,那修改,对于修改,比如说像李小明从经济系呃转到了法律系,在二方式里面只需要修改一条数据。但是插入和删除方面还是没有改进的。
29:00
比方说我们前面举的这个例子。插入。插入的例子里面,比如说学校新建了一个系。但是没有招收学生,那在这张表里面。那还是会有插入异常。那删除的情况下。比如说我们删除了一个系的所有权人,那在这张表里面,其实系的一些信息也会被随之删除。所以呢,二方式虽然针对数据冗余和修改做了一定的改进,但是在插入和删除方面呢,还是没有做到。改进。那我们看一下三放式,三放式是在二放四的基础上,消除了非主属性对马的传递依赖。
30:00
比如说左边这张图是我们刚刚讲的二方式是存呃,它是存在传递依赖的,传递依赖体现在体,体现在呃,系主任与学号之间的传递依赖。因为戏名其实是直接依赖于学号,那么系主任是依赖于姓名。那系主任是间接依赖于学号,所以他们学号与系主任之间其实是,呃,系主任是。是一个间接依赖与学号,所以这里存在是传递依赖,所以我们需要把这个传递依赖给消除,那么消除以后呢?像右边这张图。那么看一下具体的数据。那最终消除依赖以后,形成了三张表。那这样,呃。符合三放式以后呢,呃生成的这三张表呢,它对插入包括删除这方面也是有改进的,比方说插入,比如说呃,学校新建系,那其实直接。
31:14
插入到第三张表。即使是没有招收学生也是可以插入成功的。那对于删除方面。呃,删除一个系的所有学生啊,三是操作第二张表,那删除学生以后呢,但是系还是存在于第三张表中的。所以呢。对于三放式来说,他在一放式的基础上,对数据冗余和插入异插入异常,包括删除异常、修改异常这四个方面都是有所改进。好,以上呢,就是我们对放射建模的。几个内容的一个介绍。
32:02
那我们这次分享主要是呃分享这一些内容,那我们在下一次分享呢,将呃进入到维度建模的一个介绍,包括呃。我们会讲解一个简单的案例。好,那。这次分享就到这里。
我来说两句