Power BI 中的模式与数据建模
Source: Dev.to
数据建模是每个成功的 Power BI 解决方案的架构支柱。无论是构建高管仪表盘还是复杂的分析引擎,数据的结构完整性决定了性能、灵活性和报告的准确性。
模式主要分为两大类——Star 和 Snowflake——遵循在分析和商业智能中广泛使用的维度建模通用实践。每种模式定义了对事实表和维度表的不同建模方式,在简洁性、性能、存储效率和建模灵活性之间进行平衡。Star Schema 通常是推荐的做法,因为它更侧重于读取性能而非写入效率。
星型模式
星型模式涉及将数据结构化为多个表:
- 事实表 包含您想要衡量的定量属性。
- 维度表 包含对事实表数据进行分组和分类的描述性属性。

事实表
事实表记录事件(事务)。重复是正常的,因为同一种事件可能会多次发生,并且相较于维度表,事实表的更改/更新更为频繁。
-- Example fact table
FactTable_Visits (
VisitID,
PatientID,
DoctorID,
FacilityID,
DateID,
VisitCost,
LengthOfStay
)
维度表
维度表保存事实表中分类字段的信息,通常比事实表小。
-- Example dimension tables
Dimension_Patient (PatientID, FullName, …)
Dimension_Doctor (DoctorID, FullName, …)
Dimension_Facility (FacilityID, Name, …)
Dimension_Date (DateID, Date, …)
关系与基数
在 Power BI 中,关系通过将一张表中的某列与另一张表中的某列匹配来构建,将每个维度键链接到事实表中对应的键,例如:
Patient[PatientID] → FactVisits[PatientID]
Doctor[DoctorID] → FactVisits[DoctorID]
Facility[FacilityID] → FactVisits[FacilityID]
Date[DateID] → FactVisits[DateID]
如果唯一性由多个字段组合定义(例如 PatientID + DateID),则创建组合键:
PatientDateKey = PatientID & "-" & DateID
并使用该单列进行表之间的关联。
基数 描述一张表中的行可以匹配另一张表中多少行:一对一、一对多、多对一或多对多。当多对多关系不可避免时,使用 桥接表(关联实体)将其转换为两个一对多关系。
雪花模式
雪花模式将维度表规范化为多个相关的表。与在星型模式中将所有内容保存在一个大型维度表中不同,描述性数据被拆分成更小的表以减少重复。之所以称为“雪花”,是因为维度会分支成子维度,形成层级结构。
结构
- 事实表: 在特定粒度上存储可度量的事件/事务数据(数值)。
- 维度表: 拆分为多个相连的表以表示层次结构。
示例(医疗保健):
- 病人 → 病房 → 科室 → 医院
- 医生 → 专业 → 科室
事实表:就诊
| 列名 | 描述 |
|---|---|
| VisitID | 就诊的唯一标识符 |
| PatientID | 指向病人的外键 |
| DoctorID | 指向医生的外键 |
| WardID | 指向病房的外键 |
| DateID | 指向日期的外键 |
| VisitCost | 就诊费用 |
| LengthOfStay | 就诊时长 |
维度表(已规范化)
Patient (PatientID, FullName, WardID)
Ward (WardID, WardName, DepartmentID)
Department(DepartmentID, DepartmentName, HospitalID)
Hospital (HospitalID, HospitalName)
Doctor (DoctorID, FullName, SpecialtyID)
Specialty (SpecialtyID, SpecialtyName, DepartmentID)
关系
关系仍主要是 一对多,但维度通过多个层级相连(例如,病人 → 病房 → 科室 → 医院)。因此,过滤路径比星型模式更长。
良好的数据建模至关重要,因为它直接决定报告的效率、准确性和可用性。结构清晰、关系明确且冗余度低的模型能够提升查询性能,使仪表板即使在数据规模扩大时也能更快加载。通过强制数据完整性约束并定义实体之间的逻辑连接,确保计算、过滤和聚合在整个系统中保持准确,防止产生误导性洞察的错误。