惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
I
InfoQ
V
Visual Studio Blog
M
MIT News - Artificial intelligence
H
Help Net Security
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
A
About on SuperTechFans
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
WordPress大学
WordPress大学

博客园 - 哥本哈士奇(aspnetx)

dbt+SQLServer构建数据仓库(13):运维 FAQ 篇 dbt+SQLServer构建数据仓库(12):进阶 FAQ 篇 dbt+SQLServer构建数据仓库(11):FAQ 篇 dbt+SQLServer构建数据仓库(10):macro 以及 data vault的应用实例 dbt+SQLServer构建数据仓库(9):用Vibe Coding创建一个DBT UI dbt+SQLServer构建数据仓库(8):Vibe Coding用dbt构建data vault数仓 dbt+SQLServer构建数据仓库(7):进阶扩展 dbt+SQLServer构建数据仓库(6):Jinja与DAG实战 dbt+SQLServer构建数据仓库(5):数据测试 dbt+SQLServer构建数据仓库(4):分层建模实战 dbt+SQLServer构建数据仓库(3):dbt_project.yml配置精讲 dbt+SQLServer构建数据仓库(2):与传统方案对比及迁移决策 dbt+SQLServer构建数据仓库(1):认识dbt与项目工作流程 SQL Server 索引知识汇总 医疗器械行业 Salesforce Territory 完整落地实例 Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建
Power BI学习笔记第04篇:数据建模与关系管理
哥本哈士奇(aspnet · 2026-04-25 · via 博客园 - 哥本哈士奇(aspnetx)

第04篇:数据建模与关系管理

1. 什么是数据模型

数据模型是 Power BI 报表性能和分析能力的基础。当你的报表涉及多张表时,需要通过关系(Relationship)将它们连接起来,让 Power BI 知道如何在不同表之间进行跨表计算。

这一篇主要是相关概念的讲解。

1.1 为什么要建模

没有建模时,每张表是独立存在的,无法进行跨表分析。例如:

  • 销售明细表中有"产品ID"但没有"产品名称"
  • 产品信息表中有"产品ID"和"产品名称"
  • 没有关系,报表无法显示每个产品的销售总额

建立关系后,Power BI 就能自动进行跨表关联查询,类似数据库的 JOIN 操作。

1.2 进入模型视图

在 Power BI Desktop 左侧点击第三个图标(模型视图),可以可视化地看到所有表及其关系。


2. 核心概念:事实表与维度表

2.1 事实表(Fact Table)

记录发生的业务事件,如销售订单、库存变动、用户访问日志。

特点:

  • 数据量大(通常数万到数亿行)
  • 包含外键,引用维度表
  • 记录可加总的数量型字段(销售额、数量等)

示例

订单ID 产品ID 客户ID 销售日期 销售额 数量
1001 P01 C01 2024-01-01 5000 10
1002 P02 C02 2024-01-02 3000 6

2.2 维度表(Dimension Table)

描述业务实体的属性信息,用于分析和筛选。

特点:

  • 数据量相对较小
  • 包含主键(唯一标识)
  • 包含描述性文本字段

示例

产品维度表:

产品ID 产品名称 产品类别 品牌
P01 手机A 电子产品 品牌甲
P02 服装B 服装 品牌乙

客户维度表:

客户ID 客户名称 地区 客户等级
C01 公司A 北京 VIP
C02 公司B 上海 普通

3. 建立表关系

3.1 关系的构成

一个关系由三个要素组成:

要素 说明
基数(Cardinality) 一端是一还是多
交叉筛选方向(Cross-filter direction) 关系如何影响筛选上下文
活动属性(Active) 关系是否默认激活

3.2 基数类型

类型 说明 场景
一对多(1:*) 维度表1行 → 事实表多行 最常用!如1个产品对应多笔销售
多对一(*:1) 与一对多相反,从事实表看向维度表 同上
一对一(1:1) 两表行数一一对应 少见,如主表与扩展表
*多对多(*: ) 两表都是多端 需谨慎使用,可能导致性能问题

3.3 创建关系

方法一:自动检测(推荐新手)

Power BI 通常会自动检测关系。

  1. 加载数据后,进入"模型视图"
  2. 点击"主页" → "管理关系" → "自动检测"
  3. Power BI 会根据列名和数据特征自动推断关系

根据我的经验,如果数据库的建模足够好,命名足够规范,并且关系也在数据仓库里都定义好了,那么拿到Power BI里都会被自动识别出来,基本上不需要额外的建模工作。

方法二:手动创建

  1. 在模型视图中,将一个表的主键列拖拽到另一个表的外键列上
  2. 弹出"创建关系"对话框
  3. 确认基数和交叉筛选方向,点击"确定"

通常在没有数据仓库做支撑的场景,需要手动建模或者做调整。

3.4 交叉筛选方向

方向 说明 场景
单向(Single) 维度表 → 事实表 大多数情况使用单向即可
双向(Both) 两表相互影响 需要双向联动筛选时使用

⚠️ 双向筛选会显著增加计算复杂度,可能影响报表性能,建议仅在必要时使用。


4. 星型模型与雪花模型

4.1 星型模型(Star Schema)

最推荐的建模方式,结构如下:


┌───▼───┐  ┌───▼───┐  ┌───▼───┐
│ 产品  │  │ 客户  │  │ 销售渠道│
│ 维度表│  │ 维度表│  │  维度表 │
└───┬───┘  └───┬───┘  └───┬───┘
    │          │          │
    └──────────┼──────────┘
               │
        ┌──────▼──────┐
        │   销售事实表 │
        └─────────────┘

特点

  • 中心是事实表,周围是维度表
  • 所有维度表直接连接事实表,不存在中间层
  • 查询效率高,是数据仓库的经典设计

4.2 雪花模型(Snowflake Schema)

在星型模型的基础上,维度表进一步规范化,形成多层结构:

     ┌──────────────┐
     │   品牌维度表   │
     └───────┬──────┘
             │
      ┌─────▼─────┐
      │ 产品维度表 │
      └─────┬─────┘
            │
     ┌──────▼──────┐
     │  销售事实表 │
     └─────────────┘

特点

  • 减少了数据冗余,存储更节省
  • 查询时需要多层关联,性能略低于星型模型
  • 适用于维度表非常大且有明确层级的情况

💡 建议:在 Power BI 中,优先使用星型模型。如果维度表数据量很大,考虑用雪花模型来节省存储。


5. 隐藏字段与显示文件夹

5.1 隐藏字段

在模型视图中,右键点击字段 → "在报表视图中隐藏",可以将不需要在报表中直接使用的字段(如外键ID)隐藏起来,保持字段列表简洁。

隐藏后,字段仍然可以在 DAX 公式中使用,只是不显示在右侧字段面板中。

5.2 显示文件夹

对于字段较多的表,可以通过显示文件夹进行分组:

  1. 在数据窗格中选中字段
  2. 在"属性"窗格中找到"显示文件夹"
  3. 输入文件夹名称,多个字段可以用分号分隔(如"维度;日期")

6. 角色与行级安全(RLS)

Power BI 支持基于角色的行级安全,控制不同用户看到不同的数据。

示例:区域经理只能看到自己负责区域的数据

  1. 在"建模"选项卡中点击"管理角色"
  2. 创建角色(如"区域经理")
  3. 为该角色添加 DAX 筛选表达式:
    [地区] = USERPRINCIPALNAME()
    
  4. 在 Power BI Service 发布后,为不同用户分配不同角色

7. 常见建模问题与解决

问题 原因 解决方案
关系线是虚线 关系不唯一或有问题 检查基数设置,确保一端唯一
图表显示空白 关系未建立或方向错误 在模型视图中检查关系
计算结果不对 存在多对多关系导致歧义 使用 SUMX 替代 SUM,或设置正确的关系方向
报表加载很慢 模型太复杂,双向筛选过多 简化模型,减少双向筛选使用

8. 小结

本篇介绍了:

  • ✅ 事实表与维度表的核心概念
  • ✅ 创建和管理表关系(基数、交叉筛选方向)
  • ✅ 星型模型与雪花模型的设计与选择
  • ✅ 隐藏字段、显示文件夹、角色与行级安全

下一篇:我们将学习 Power BI 的核心计算语言 DAX,从计算列和度量值开始,掌握数据分析公式的基础用法。