面试题
问题1:in exists 的区别 not in 和 not exists的区别?
答案:n 是一个集合运算符. a in {a,c,d,s,d…} 这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的. 而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
总之:
尽量使用not exist ,避免使用not in
not in 会默认调用子查询
not exist 会调用关联子查询
问题2:拉链表知道么?
答案:拉链表就是随着时间变迁产生历史数据。
拉链表的含义:就是记录历史。记录一个事务从开始一直到当前状态的所有变化信息。
问题3:数仓三层架构,具体每层作用?
答案:
1:数据访问层:主要是对非原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据库的操作,而不是数据,具体为业务逻辑层或表示层提供数据服务。
2:业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。
3:界面层:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
问题4:为什么叫星型模型和雪花模型?
答案:
星型模型是:多维表的数据关系,它由一个事实表和一组维表组成,每个维作为主键
雪花模型是:当一个或多个维没有直接连接到事实表上,而是通过其他维表连接到事实表上的时候,其图解就像雪花模型连接在一起、
使用场景:雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?” 星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”
问题5:星型模型和雪花模型各自的优点?
答案:
概念
根据事实表和维度表的关系,可将常见的模型分为星型模型和雪花模型。在数据仓库的建设中,一般都会围绕着这两种模型来设计表关系或者结构。那么什么是事实表和维度表呢?在维度建模中,将度量称为“事实” ,将环境描述为“维度”。维度是用于分析事实所需要的多样环境。例如,在分析交易过程时,可以通过买家、卖家、商品和时间等维度描述交易发生的环境。事实则紧紧围绕着业务过程来设计,通过获取描述业务过程的度量来表达业务过程,包含了引用的维度和与业务过程有关的度量。例如订单作为交易行为的核心载体,直观反映了交易的状况。订单的流转会产生很多业务过程,而下单、支付和成功完结三个业务过程是整个订单的关键节点。获取这三个业务过程的笔数、金额以及转化率是日常数据统计分析的重点,事务事实表设计可以很好地满足这个需求。
当所有维表都直接连接到事实表上时,整个图解就像星星一样,故将该模型称为星型模型。
星型架构是一种非正规化的结构,多维数据集的每一个维度都直接与事实表相连接,不存在渐变维度,所以数据有一点的冗余。如在地域维度表中,存在国家 A 省 B 的城市 C 以及国家 A 省 B 的城市 D 两条记录,那么国家 A 和省 B 的信息分别存储了两次,即存在冗余。
![67e74dccd9458e8fc6992d4d6e86bba7.png](https://img-blog.csdnimg.cn/img_convert/67e74dccd9458e8fc6992d4d6e86bba7.png)
星型模型强调的是对维度进行预处理,将多个维度集合到一个事实表,形成一个宽表。这也是我们在使用hive时,经常会看到一些大宽表的原因,大宽表一般都是事实表,包含了维度关联的主键和一些度量信息,而维度表则是事实表里面维度的具体信息,使用时候一般通过join来组合数据,相对来说对OLAP的分析比较方便。
当有一个或多个维表没有直接连接到事实表上,而是通过其他维度表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。
雪花模型是对星型模型的扩展,它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的 "层次 " 区域,这些被分解的表都连接到主维度表而不是事实表。如将地域维表分解为国家,省份,城市等维表。它的优点是:通过最大限度地减少数据存储量以及联合较小的维表来改善查询性能,去除了数据冗余,但是在分析数据的时候,操作比较复杂,需要join的表比较多所以其性能并不一定比星型模型高。
![721f77d8f811cd2bd442629d899e91e0.png](https://img-blog.csdnimg.cn/img_convert/721f77d8f811cd2bd442629d899e91e0.png)
区别及优缺点
星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花模型要高。
星型模型不用考虑很多正规化的因素,设计与实现都比较简单。
雪花模型由于去除了冗余,有些统计就需要通过表的连接才能产生,所以效率不一定有星型模型高。
正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的ETL、以及后期的维护都要复杂一些。因此在冗余可以接受的前提下,实际运用中星型模型使用更多,也更有效率。
![2b739f38d0cbd85daed003c73e3ff040.png](https://img-blog.csdnimg.cn/img_convert/2b739f38d0cbd85daed003c73e3ff040.png)
什么时候使用雪花模型?
Ralph Kimball,数据仓库大师,讲述了三个例子。对于三个例子,使用雪花模型不仅仅是可接受的,而且可能是一个成功设计的关键。
1、一个用户维度表且数据量较大。其中,80%的事实度量表是匿名访问者,仅包含少数详细信息。20%的是可靠的注册用户,且这些注册用户有较为详细的信息,与多个维度表中的数据相连。
2、例如一个金融产品维度表,且这些金融产品有银行类的,保险类等等区别。因此不同种类的产品有自己一系列的特殊属性,且这些属性并非是所有产品共享的。
3、多个企业共用的日历维度表。但每个企业的财政周期不同,节假日不同等等。在数据仓库的环境中用雪花模型,降低储存的空间,到了具体某个主题的数据集市再用星型模型。
雪花模型使得维度分析更加容易,比如“针对特定的广告主,有哪些客户或者公司是在线的?”,星形模型用来做指标分析更适合,比如“给定的一个客户他们的收入是多少?”
总结
通过上面的对比我们可以发现,在数据仓库建设中大多时候比较适合使用星型模型构建底层数据Hive表,通过大量的冗余来提升查询效率,星型模型对OLAP的分析引擎支持比较友好,这一点在Kylin中比较能体现。而雪花模型在关系型数据库中如MySQL,Oracle中非常常见,尤其像电商的数据库表。在数据仓库中雪花模型的应用场景比较少,但也不是没有,所以在具体设计的时候,可以考虑是不是能结合两者的优点参与设计,以此达到设计的最优化目的。
问题6:什么是缓慢变化维
答案:
缓慢变化维
1.缓慢变化维在数据仓库中,有个概念叫缓慢变化维,经常简写为SCD, 2.缓慢变化维的提出是因为现实世界中,维度的属性并不是静态的,它会随时间的流失发生缓慢的变化。这种随着时间变化的我们称之为缓慢变化维。。。
问题7:如果现在有一千张表从一个库到另外一个库的ODS层,你会怎么做?
答案:利用消息队列做数据订阅发布
问题8:‘2019-04-12’ 取 周几
答案:weekofyear
问题9:说说数仓分层?
答案:
![797f3df0d14d704ddd8d8d8bf0842edc.png](https://img-blog.csdnimg.cn/img_convert/797f3df0d14d704ddd8d8d8bf0842edc.png)
问题10:为什么要对数仓进行分层?
答案:
问题11:说说你对数据仓库的理解?
答案:
数据仓库是面向主题进行组织的,数据是集成的、不可更新的、随时间变化的的。
数据仓库经历了这样三个阶段:简单报表阶段、数据集市阶段、数据仓库阶段。
问题12:数据库和数据仓库的区别?
数据库:是一种逻辑概念,用来存放数据的仓库,通过数据库软件来实现。数据库由很多表组成,表是二维的,一张表里可以有很多字段。
数据仓库:是数据库概念的升级。从逻辑上理解,数据库和数据仓库没有区别,都是通过数据库软件实现存放数据的地方,但是从数据量来讲数据仓库比数据库更庞大些。数据仓库的主要作用用于数据挖掘、数据分析,辅助领导来做决策的。
区别:实际上二者之间讲的是OLTP和OLAP
操作型处理 OLTP:它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。分析型处理 OLAP:一般针对某些主题的历史数据进行分析,支持管理决策。
问题13:如何构建数据仓库?
答案:
数据仓库模型的选择是灵活的,不局限与某种模型方法;数据仓库数据是灵活的,以实际需求场景为导向;数仓设计要兼顾灵活性、可扩展性、要考虑技术可靠性和实现成本
1)调研:业务调研、需求调研、数据调研
2)划分主题域:通过业务调研、需求调研、数据调研最终确定主题域
3)构建总线矩阵、维度建模
总线矩阵:把总线架构列表形成矩阵形式,行表示业务处理过程,即事实,列表示一致性的维度,在交叉点上打上标记表示该业务处理过程与该维度相关(交叉探查)
4)设计数仓分层架构
5)模型落地
6)数据治理
问题14:什么是数据中台?
答案:
数据中台是通过数据技术,对海量数据进行采集、计算、存储、加工,同时统一标准和口径。数据中台把数据统一之后,会形成标准数据,再进行存储,形成大数据资产层,进而为客户提供高效服务。这些服务和企业的业务有较强关联性,是企业所独有且能复用的,他是企业业务和数据的积淀,其不仅能降低重复建设,减少烟囱式协助的成本,也是差异化竞争的优势所在。
数据中台是通过整合公司开发工具、打通全域数据、让数据持续为业务赋能,实现数据平台化、数据服务化和数据价值化。数据中台更加侧重于“复用”和“业务”。
问题15:数据中台、数据仓库、大数据平台、数据湖的关键区别是什么??
答案:
)基础能力上的区别
数据平台:提供的是计算和存储能力
数据仓库:利用数据平台提供的计算和存储能力,在一套方法论的指导下建设的一整套的数据表
数据中台:包含了数据平台和数据仓库的所有内容,将其打包,并且以更加整合以及更加产品化的方式对外提供服务和价值
数据湖:一个存储企业各种各样原始数据的大型仓库,包括结构化和非结构化数据,其中湖里的数据可供存取、处理、分析和传输
2)业务能力上的区别
数据平台:为业务提供数据主要方式是提供数据集
数据仓库:相对具体的功能概念是存储和管理一个或多个主题数据的集合,为业务提供服务的方式主要是分析报表
数据中台:企业级的逻辑概念,体现企业数据产生价值的能力,为业务提供服务的主要方式是数据API
数据湖:数据仓库的数据来源
总的来说,数据中台距离业务更近,数据复用能力更强,能为业务提供速度更快的服务,数据中台在数据仓库和数据平台的基础上,将数据生产为一个个数据API服务,以更高效的方式提供给业务。数据中台可以建立在数据仓库和数据平台之上,是加速企业从数据到业务价值的过程的中间层。
问题16:大数据有哪些相关的系统?
答案:
数仓设计中心:按照主题域、业务过程,分层的设计方式,以维度建模作为基本理论依据,按照维度、度量设计模型,确保模型、字段有统一的命名规范
数据资产中心:梳理数据资产,基于数据血缘,数据的访问热度,做成本的治理
数据质量中心:通过丰富的稽查监控系统,对数据进行事后校验,确保问题数据第一时间被发现,避免下游的无效计算,分析数据的影响范围。
指标系统:管理指标的业务口径、计算逻辑和数据来源,通过流程化的方式,建立从指标需求、指标开发、指标发布的全套协作流程
数据地图:提供元数据的快速索引,数据字典、数据血缘、数据特征信息的查询,相当于元数据中心的门户。
问题17:如何建设数据中台?
答案:
数据中台在企业落地实践时,结合技术、产品、数据、服务、运营等方面,逐步开展相关工作
1)理现状:了解业务现状、数据现状、IT现状、现有的组织架构
2)定架构:确认业务架构、技术架构、应用架构、组织架构
3)建资产:建立贴近数据层、统一数仓层、标签数据层、应用数据层
4)用数据:对数据进行输出、应用
5)数据运营:持续运营、持续迭代
中台建设需要有全员共识,由管理层从上往下推进,由技术和业务人员去执行和落地是一个漫长的过程,在实施数据中台时,最困难的地方就是需要有人推动。
问题18:数据仓库最重要的是什么?
答案:
个人认为是数据集成和数据质量
企业的数据通常存储在多个异构数据库中,要进行分析,必须对数据进行一致性整合,整合后才能对数据进行分析挖掘出潜在的价值;
数据质量必须有保障,数据质量不过关,别人怎么会使用你的数据?
问题19:概念模型、逻辑模型、物理模型分别介绍一下?
答案:
1)概念模型CDM:概念模型是最终用户对数据存储的看法,反映了最终用户综合性的信息需求,以数据类的方式描述企业级的数据需求
概念模型的内容包括重要的实体与实体之间的关系,在概念模型中不包含实体的属性,也不包含定义实体的主键
概念模型的目的是统一业务概念,作为业务人员和技术人员之间的沟通桥梁,确定不同实体之间的最高层次的关系
2)逻辑模型LDM:逻辑模型反映的是系统分析人员对数据存储的观点,是对概念模型的进一步分解和细化,逻辑模型是根据业务规则确定的,关于业务对象,业务对象的数据项以及业务对象之间关系的基本蓝图
逻辑模型的内容包括所有的实体和关系,确定每个实体的属性,定义每个实体的主键,指定实体的外键,需要进行范式化处理
逻辑模型的目标是尽可能详细的描述数据,并不考虑物理上如何实现
3)物理模型PDM:物理模型是在逻辑模型的基础上,考虑各种具体的技术实现因素,进行数据体系结构设计,真正实现数据在数据仓库中的存放
物理模型的内容包括确定所有的表和列,定义外键用确认表之间的关系,基于用户的需求可能要进行反范式化等内容
问题20:SCD常用的处理方式有哪些?
答案:
slowly changing dimensions 缓慢变化维度
常见的缓慢变化维处理方式有三种:
1)直接覆盖:不记录历史数据,薪数据覆盖旧数据
2)新加一行数据(纵向扩展):使用代理主键+生效失效时间或者是代理主键+生效失效标识(保存多条记录,直接新添一条记录,同时保留原有记录,并用单独的专用字段保存)
3)新加两个字段(横向扩展):一个是previous,一个是current,每次更新只更新这两个值,但是这样职能保留最近两次的变化(添加历史列,用不同的字段保存变化痕迹,因为只保存两次变化记录,使用与变化不超过两次的维度)
问题21:怎么理解元数据?
答案:
狭义来讲就是:元数据就用来描述数据的数据
广义来讲,除了业务逻辑直接读写处理的业务数据,所有其他用来维护整个系统运转所需要的数据,都可以认为是元数据
在数仓中,元数据可以帮助数仓人员方便找到他们所关系的数据,是描述数仓内部数据的结构和建立方法的数据。按照用途可分为:技术元数据、业务员数据
技术元数据:存储关于数据仓库技术细节的数据,用于开发和管理数仓使用的数据 业务元数据:从业务角度描述了数据仓库中的数据,提供介于使用者和实际系统之间的语义层,使不懂计算机技术的业务人员也能读懂数仓中的数据 元数据管理功能
数据地图:以拓扑图的形式对数据系统的各类数据实体、数据处理过程元数据进行分层次的图形化展示,并通过不同层次的图形展现。元数据分析:血缘分析、影响分析、实体关联分析、实体差异分析、指标一致性分析。辅助应用优化:结合元数据分析功能,可以对数据系统的应用进行优化。辅助安全管理:采用合理的安全管理机制来保障系统的数据安全;对数据系统的数据访问和功能使用进行有效监控。基于元数据的开发管理:通过元数据管理系统规范日常开发的工作流程(包括任务调度系统)。
问题22:数仓如何确定主题域?
答案:
主题是在较高层次上将数据进行综合、归类和分析利用的一个抽象概念,每一个主题基本对应一个宏观的分析领域,在逻辑意义上,他是对企业中某一宏观分析领域所涉及的分析对象。
面向主题的数据组织方式,就是在较高层次上对分析对象的数据的一个完整并且一致的描述,能刻画各个分析对象所涉及的企业各项数据,以及数据之间的联系。
主题域通常是联系较为机密的数据主题的集合,可以根据业务的关注度,将这些数据主题划分到不同的主题域(也就是说对某个主题进行分析后确定的主题的边界)。
关于主题域的划分,可以考虑几方面:
1、按照业务或者业务过程划分:比如一个靠销售广告位置的门户网站主题域可能会有广告域,客户域等,而广告域可能就会有广告的库存,销售分析、内部投放分析等主题;
2、根据需求方划分:比如需求方为财务部,就可以设定对应的财务主题域,而财务主题域里面可能就会有员工工资分析,投资回报比分析等主题;
3、按照功能或者应用划分::比如微信中的朋友圈数据域、群聊数据域等,而朋友圈数据域可能就会有用户动态信息主题、广告主题等;
4、按照部门划分:比如可能会有运营域、技术域等,运营域中可能会有工资支出分析、活动宣传效果分析等主题;
总而言之,切入的出发点逻辑不一样,就可以存在不同的划分逻辑。在建设过程中可采用迭代方式,不纠结于一次完成所有主题的抽象,可先从明确定义的主题开始,后续逐步归纳总结成自身行业的标准模型。
问题23:如何控制数据质量?
答案:
1)校验机制,每天对比数据量,比如count(*),早发现,早修复
2)数据内容的比对,抽样对比
3)复盘、每月做一次全量
问题24:模型设计的思路?业务驱动?数据驱动?
答案:
构建数据仓库有两种方式:自上而下、自下而上
Bill Inmon推崇自上而下的方式,一个企业建立唯一的数据中心,数据是经过整合、清洗、去掉脏数据、标准的、能够提供统一的视图。要从整个企业的环境入手,建立数据仓库,要做很全面的设计。偏数据驱动
Ralph Kimball推崇自下而上的方式,认为数据仓库应该按照实际的应用需求,架子啊需要的数据,不需要的数据不要加载到数据仓库中。这种方式建设周期短,用户能很快看到结果。偏业务驱动
问题25:为什么需要数据仓库建模?
答案:
数仓建模需要按照一定的数据模型,对整个企业的数据进行采集,整理,提供跨部门、完全一致的报表数据。
合适的数据模型,对于大数据处理来讲,可以获得得更好的性能、成本、效率和质量。良好的模型可以帮助我们快速查询数据,减少不必要的数据冗余,提高用户的使用效率。
数据建模进行全方面的业务梳理,改进业务流程,消灭信息孤岛,更好的推进数仓系统的建设。
简单报表阶段:这个阶段,系统的主要目标是解决一些日常的工作中业务人员需要的报表,以及生成一些简单的能够帮助领导进行决策所 需要的汇总数据。大部分表现形式为数据库和前端报表工具。
数据集市阶段:这个阶段,主要是根据某个业务部门的需要,进行一定的数据的采集,整理,按照业务人员的需要,进行多维报表的展现, 能够提供对特定业务指导的数据,并且能够提供特定的领导决策数据。
数据仓库阶段:这个阶段,主要是按照一定的数据模型,对整个企业的数据进行采集,整理,并且能够按照各个业务部门的需要,提供 跨部门的,完全一致的业务报表数据,能够通过数据仓库生成对对业务具有指导性的数据,同时,为领导决策提供全面的数据支持。
通过数据仓库建设的发展阶段,其实可以看出,数据仓库的建设和数据集市的建设的重要区别就在于数据模型的支持。因此,数据模型的建设,对于我们数据仓库的建设,有着决定性的意义。
一般来说,数据模型的建设主要能够帮助我们解决以下的一些问题:
进行全面的业务梳理,改进业务流程。
在业务模型建设的阶段,能够帮助我们的企业或者是管理机关对本单位的业务进行全面的梳理。
通过业务模型的建设,我们应该能够全面了解该单位的业务架构图和整个业务的运行情况,能够将业务按照特定的规律进行分门别类和程序化。
同时,帮助我们进一步的改进业务的流程,提高业务效率,指导我们的业务部门的生产。
建立全方位的数据视角,消灭信息孤岛和数据差异。
通过数据仓库的模型建设,能够为企业提供一个整体的数据视角,不再是各个部门只是关注自己的数据。
而且通过模型的建设,勾勒出了部门之间内在的联系,帮助消灭各个部门之间的信息孤岛的问题。
更为重要的是,通过数据模型的建设,能够保证整个企业的数据的一致性,各个部门之间数据的差异将会得到有效解决。
解决业务的变动和数据仓库的灵活性。
通过数据模型的建设,能够很好的分离出底层技术的实现和上层业务的展现。当上层业务发生变化时,通过数据模型,底层的技术实现可以非常轻松的完成业务的变动,从而达到整个数据仓库系统的灵活性。
帮助数据仓库系统本身的建设。
通过数据仓库的模型建设,开发人员和业务人员能够很容易的达成系统建设范围的界定,以及长期目标的规划,从而能够使整个项目组明确当前的任务,
加快整个系统建设的速度。
建模大致分为四个阶段:
业务建模,这部分建模工作,主要包含以下几个部分:
划分整个单位的业务,一般按照业务部门的划分,进行各个部分之间业务工作的界定,理清各业务部门之间的关系。
深入了解各个业务部门的内具体业务流程并将其程序化。
提出修改和改进业务部门工作流程的方法并程序化。
数据建模的范围界定,整个数据仓库项目的目标和阶段划分。
领域概念建模,这部分建模工作,主要包含以下几个部分:
抽取关键业务概念,并将之抽象化。
将业务概念分组,按照业务主线聚合类似的分组概念。
细化分组概念,理清分组概念内的业务流程并抽象化。
理清分组概念之间的关联,形成完整的领域概念模型。
概念模型具体要求如下:
![c8d9ed8a2736f2a9778d33e414760e36.png](https://img-blog.csdnimg.cn/img_convert/c8d9ed8a2736f2a9778d33e414760e36.png)
逻辑建模,这部分的建模工作,主要包含以下几个部分:
业务概念实体化,并考虑其具体的属性。
事件实体化,也就是所谓的事实,并考虑其属性内容。
说明实体化,也就是所谓的维度,并考虑其属性内容。
逻辑模型具体要求如下:
![50d567d7195b068495e462105bc39067.png](https://img-blog.csdnimg.cn/img_convert/50d567d7195b068495e462105bc39067.png)
物理建模,这部分的建模工作,主要包含以下几个部分:
针对特定物理化平台,做出相应的技术调整。
针对模型的性能考虑,对特定平台作出相应的调整。
针对管理的需要,结合特定的平台,做出相应的调整。
生成最后的执行脚本,并完善之。
物理模型具体要求如下:
![db7f609749089457cd6473b5812e6eba.png](https://img-blog.csdnimg.cn/img_convert/db7f609749089457cd6473b5812e6eba.png)
其实简单点说,上面的模型设计流程大部分应用于DWD层,也就是事实维度层。通过建模,捋清逻辑,把业务落实到一张张表,并梳理表于表之间的关系。
问题26:说一下数仓的你们的数据处理,数据流转?
答案:
按照数仓分层思想,分为ods贴源层、dw主题层、mid维表层、dm集市层、app应该层
过程如下:
数据通过采集或同步落地基于HDFS存储的ods层
主题抽取确认
如果有此需求,构建基于主题数据的微聚合结果
构建维表层数据,如时间、地区、产品类别等数据
进行数据集市构建如统计结果、用户画像、TopN热门数据
进行集市数据的输出到app进行BI可视化展示
问题27:表分类?
答案:
实体表:一般是指现实存在的业务对象
维度表:一般是指对应一些业务状态,也可称为码表
事务型事实表:一般指随着业务发生不断产生数据,特点是一旦发生不会再变化
周期型事实表:一般指随着业务发生不断产生变化(更新,新增)的数据,如订单
问题28:同步策略有哪些?
答案:
全量表:存储完整的数据
增量表:存储新增加的数据
新增及变化表:存储新增加的数据和变化的数据
拉链表:对新增及变化表做定期合并
实体表(用户,商品,商家):每日全量
维度表(订单状态,审批状态,商品分类):每日全量
事务型实时表(交易流水,操作日志,出库入库记录):数据量大且不变,每日增量表,每日创建一个分区存储
周期型事实表(订单,请假等):用每日新增和变化表,制作一张拉链表
参考资料:https://blog.csdn.net/weixin_46163590/article/details/106057768 https://blog.csdn.net/winterPassing/article/details/105929303 https://blog.csdn.net/weixin_39032019/article/details/116303347 https://blog.csdn.net/fenglei0415/article/details/99094482 https://blog.csdn.net/qianfeng_dashuju/article/details/105724368
历史精彩文章