大厂数据仓库数据建模八股文面试题及参考答案(虾皮希音Bigo等多家公司汇总)
什么是数据仓库,和数据库有什么区别?
数据仓库(Data Warehouse,DW)是专门为支持企业决策而设计的系统,通过整合来自不同来源的数据,提供统一的分析视图。其核心目标是支持复杂的查询、历史数据分析和数据挖掘。数据仓库通常采用非规范化结构(如星型模型或雪花模型),并围绕业务主题(如销售、库存)组织数据。
数据库(Database)则主要用于事务处理(OLTP),支持日常业务操作,如订单录入、用户注册等。数据库设计遵循规范化原则(如第三范式),以消除冗余并确保事务的原子性和一致性。
区别对比
设计目标 |
支持决策分析(OLAP),处理复杂查询和聚合操作 |
支持事务处理(OLTP),保证数据增删改查的高效性和一致性 |
数据结构 |
非规范化设计(星型/雪花模型),冗余数据多,便于快速分析 |
规范化设计(如第三范式),冗余少,结构复杂 |
数据时效性 |
存储历史数据(可能包含多年数据),定期批量更新(ETL) |
存储当前数据,实时或近实时更新 |
查询类型 |
复杂分析查询(多表关联、聚合、窗口函数等),数据量大 |
简单事务查询(单行操作、索引扫描),数据量相对较小 |
用户群体 |
数据分析师、决策层 |
应用系统、业务人员 |
示例场景
- 数据库:电商平台的订单表实时记录用户下单信息,每次下单会插入一条新记录,并通过索引快速检索订单状态。
- 数据仓库:将订单表与用户表、商品表整合,分析“2023年某品类商品的季度销售额趋势”,需关联多表并计算聚合值。
数据仓库的基本原理是什么?
数据仓库的核心原理围绕数据整合、分析优化和历史数据管理展开,具体包括以下要点:
- 集成性数据仓库从多个异构数据源(如数据库、日志文件、API)抽取数据,通过清洗、转换(ETL/ELT)消除数据差异(如字段名冲突、单位不统一),最终存储为统一格式。例如,将不同系统的“金额”字段统一为人民币单位。
- 主题导向数据按业务主题(如客户、产品)而非应用功能划分。每个主题域包含相关的事实表(如销售事实)和维度表(如时间维度),便于从业务角度分析数据。
- 非易失性数据仓库的数据通常只追加不修改(Insert-Only),即使源系统数据被删除或更新,仓库中仍保留历史快照。例如,用户地址变更后,仓库可能保留变更前后的记录以支持历史分析。
- 时变性数据仓库记录数据随时间变化的状态。例如,使用“缓慢变化维度”(SCD)技术跟踪客户会员等级的变化历史。
技术实现原理
- ETL流程:Extract:从源系统抽取数据(全量或增量)。Transform:清洗(去重、补全)、转换(计算衍生字段)、聚合(预汇总)。Load:加载到目标表,可能采用分区或列式存储优化查询性能。
- 存储结构:采用列式存储(如Parquet)减少I/O,或使用MPP架构(如Hive on Spark)并行处理查询。
数据仓库架构是怎样的?
数据仓库的架构通常分为三层,但具体实现可能因企业需求和技术选型有所差异:
- 数据源层包括内部系统(如MySQL、ERP)和外部数据(如第三方API、日志文件)。数据可能以结构化(表)、半结构化(JSON)或非结构化(图片)形式存在。
- ETL层负责数据加工:
- 抽取:通过工具(如Sqoop、Flink CDC)捕获增量数据。
- 清洗:处理脏数据(如NULL值、格式错误)。
- 转换:关联维度、计算指标(如用户留存率)。
- 加载:写入目标存储(HDFS、Hive表)。
- 存储层
- ODS(操作数据存储):近原始数据,供临时查询或重新加工。
- DWD(明细层):清洗后的明细数据,按主题组织。
- DWS(汇总层):预聚合的指标(如每日销售额)。
- ADS(应用层):面向业务的数据集市(如报表、API接口)。
- 服务层 提供数据查询(OLAP引擎如Presto)、可视化(如Tableau)和API服务(如Restful接口)。
现代架构扩展
- Lambda架构:结合批处理(高延迟高准确)和流处理(低延迟近似)。
- 数据湖架构:存储原始数据(包括非结构化),按需转换为数仓结构。
数据仓库分层(层级划分),每层做什么?分层的好处是什么?数据分层是根据什么?数仓分层的原则与思路是什么?
分层结构
- ODS(操作数据层)存储从源系统抽取的原始数据,仅做简单清洗(如去重、字段格式化)。保留历史快照,供数据回溯使用。
- DWD(明细数据层)对ODS层数据进行深度清洗(如处理NULL值、统一单位),并按业务主题建模(如订单事实表、用户维度表)。此层数据粒度最细,通常采用星型模型。
- DWS(汇总数据层)基于DWD层预计算常用指标(如用户月活、商品销量Top10),减少重复计算。例如,创建“每日销售汇总表”以加速报表生成。
- ADS(应用数据层)直接面向业务需求,如生成报表(BI工具直接读取)、推荐系统特征表等。此层可能包含高度聚合的数据或特定业务逻辑加工的结果。
分层的好处
- 解耦:各层职责明确,修改某一层不影响其他层(如ODS结构调整只需适配DWD)。
- 复用性:DWS层的预聚合指标可被多个业务复用,避免重复计算。
- 数据一致性:通过分层加工确保指标口径统一(如“销售额”在DWD层明确定义)。
分层依据
- 数据处理阶段:从原始数据到应用数据的逐步加工过程。
- 数据粒度:从细粒度(DWD)到粗粒度(DWS)的过渡。
- 业务需求:根据最终应用场景(如实时报表、机器学习)设计ADS层。
分层原则
- 高内聚低耦合:每层专注于单一职责(如DWD仅处理明细数据)。
- 可追溯性:支持数据血缘追踪(如ADS层指标可追溯至DWD字段)。
- 性能优化:通过分层预计算减少查询响应时间。
数仓建模常用模型有哪些?区别、优缺点是什么?星型模型和雪花模型的区别?应用场景?优劣对比如何?
常用模型
- 范式模型(Inmon流派)特点:遵循数据库规范化设计(第三范式),减少冗余。优点:数据一致性高,适合频繁更新的场景。缺点:查询需多表关联,性能较差。场景:适用于ODS层或需要高度一致性的操作型系统。
- 维度模型(Kimball流派)星型模型:事实表直接关联多个维度表,维度表非规范化。 优点:查询简单(关联少),性能高。缺点:维度冗余(如国家-省份-城市合并为“地区”维度)。雪花模型:维度表进一步规范化(如地区维度拆分为国家、省份表)。 优点:减少冗余,节省存储。缺点:查询复杂度高(需多层关联)。
星型 vs 雪花模型对比
结构 |
事实表 + 非规范化维度表 |
事实表 + 规范化维度表(可能多层) |
查询性能 |
高(关联少) |
低(多层关联) |
存储开销 |
高(维度冗余) |
低(维度无冗余) |
适用场景 |
高频分析(如报表、即席查询) |
需要节省存储或维度频繁更新的场景 |
示例
- 星型模型:销售事实表直接关联“产品维度表”(包含产品名称、类别、品牌)。
- 雪花模型:将“产品维度表”拆分为“产品表”和“类别表”,通过外键关联。
建模选择
- 优先星型模型以提高查询性能,仅在维度数据量极大(如百万级)时考虑雪花模型。
数仓建模有哪些方式?数仓建模的流程是什么?
数据仓库建模的核心方式包括范式建模、维度建模和Data Vault建模,每种方式适用于不同场景:
- 范式建模(Inmon方法)遵循数据库规范化原则(如第三范式),强调数据一致性和低冗余。数据按主题域划分,通过实体关系(ER)模型设计,通常用于企业级数仓的全局设计。优点:数据冗余少,更新效率高。缺点:查询复杂,需要多表关联,分析性能较低。
- 维度建模(Kimball方法)以业务过程为中心,采用星型模型或雪花模型设计,包含事实表和维度表。优点:查询性能高,适合分析场景。缺点:数据冗余较多,存储成本较高。
- Data Vault建模由中心表(Hub)、链接表(Link)和卫星表(Satellite)组成,适用于需要高扩展性和审计能力的场景(如数据湖)。优点:支持历史追溯和灵活扩展。缺点:实现复杂,查询需多层关联。
建模流程
- 需求分析与业务方沟通明确分析目标(如销售额分析、用户行为分析),确定核心业务过程(如“下单”“支付”)。
- 概念模型设计定义主题域(如“销售主题”包含订单、商品等实体),确定数据范围和关键指标。
- 逻辑模型设计选择建模方式(如维度建模),设计事实表与维度表的结构。例如:事实表:订单事实表(订单ID、金额、时间)。维度表:时间维度表(日期、周、季度)。
- 物理模型设计根据技术选型(如Hive、ClickHouse)定义存储格式(Parquet)、分区策略(按天分区)和索引。
- ETL开发编写数据清洗和转换逻辑。例如,使用SQL处理数据倾斜:
- 验证与优化通过数据血缘工具追踪指标来源,优化查询性能(如预聚合、物化视图)。
维度建模的步骤有哪些,如何确定这些维度?维度建模和范式建模区别是什么?
维度建模步骤
- 选择业务过程明确分析目标对应的业务事件(如“用户下单”),确定事实表的核心行为。
- 声明粒度定义事实表的记录粒度(如“单个订单项”或“每日汇总”),需确保粒度不可再分。
- 确定维度围绕业务过程提取描述性属性:直接维度:如订单表中的“用户ID”“商品ID”。衍生维度:通过ETL生成(如“用户年龄层”基于出生日期计算)。
- 确定事实定义可度量的数值字段(如“订单金额”“商品数量”),区分类型:可加事实:可跨维度求和(如销售额)。半可加事实:仅部分维度可加(如库存量按时间不可加)。
- 模型设计构建星型模型(推荐)或雪花模型,例如:
维度确定方法
- 业务文档分析:参考需求文档中的筛选条件(如“按地区分析销量”对应“地区维度”)。
- 数据探查:通过SQL查询源表字段分布,识别高频筛选字段。
维度建模 vs 范式建模
设计目标 |
优化查询性能,支持分析场景 |
减少冗余,确保数据一致性 |
结构 |
星型/雪花模型,事实表关联维度表 |
高度规范化,多表关联 |
适用场景 |
数据仓库、数据集市 |
操作型数据库、ODS层 |
维度表和事实表的区别是什么?什么是 ER 模型?
维度表与事实表对比
内容 |
描述性属性(如用户姓名、商品分类) |
可度量的数值(如订单金额、点击次数) |
数据量 |
相对较小(通常千到百万级) |
极大(可能亿级或更大) |
更新频率 |
低频更新(如用户地址变更) |
高频插入(如每笔订单插入一条记录) |
示例
- 维度表:
dim_user
包含 user_id、gender、age_range。 - 事实表:
fact_sales
包含 sale_id、user_id、sale_amount。
ER模型(实体关系模型)
ER模型通过实体(Entity)、属性(Attribute)和关系(Relationship)描述数据结构,常用于数据库设计。例如:
- 实体:订单(Order)、用户(User)。
- 属性:订单的“金额”、用户的“姓名”。
- 关系:一个用户可创建多个订单(一对多关系)。
与维度建模区别
- ER模型强调数据一致性,用于OLTP系统;维度模型优化查询性能,用于OLAP系统。
OLAP、OLTP 如何解释(区别)?三范式是什么,请举例说明。
OLAP vs OLTP
目标 |
支持复杂分析、数据挖掘 |
支持高并发事务操作(增删改查) |
数据量 |
海量历史数据 |
当前数据,规模较小 |
操作类型 |
批量读取、复杂聚合 |
短事务、单行操作 |
典型系统 |
数据仓库、BI工具 |
电商订单系统、银行交易系统 |
三范式
- 第一范式(1NF)字段不可再分。例如,将“联系方式”拆分为“电话”和“邮箱”:错误设计:user(id, contact),其中contact存储“电话,邮箱”。正确设计:user(id, phone, email)。
- 第二范式(2NF)消除部分依赖,确保非主键字段完全依赖主键。例如订单表:错误设计:orders(order_id, product_id, product_name, amount)(product_name依赖product_id而非主键order_id)。正确设计:拆分为orders(order_id, product_id, amount)和products(product_id, product_name)。
- 第三范式(3NF)消除传递依赖。例如用户表:错误设计:user(id, city, province)(province依赖city,city依赖id)。正确设计:拆分为user(id, city)和city_info(city, province)。
维度设计过程和事实设计过程是怎样的?
维度设计过程
- 识别维度从业务需求中提取分析视角(如“按时间、
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
17年+码农经历了很多次面试,多次作为面试官面试别人,多次大数据面试和面试别人,深知哪些面试题是会被经常问到。 在多家企业从0到1开发过离线数仓实时数仓等多个大型项目,详细介绍项目架构等企业内部秘不外传的资料,介绍踩过的坑和开发干货,分享多个拿来即用的大数据ETL工具,让小白用户快速入门并精通,指导如何入职后快速上手。 计划更新内容100篇以上,包括一些企业内部秘不外宣的干货,欢迎订阅!