我的事实表包含他参加的课程中的用户分数。我必须在报告中显示的课程的一些细节来自不止一个表(在实际的 OLTP 数据库中)。
我是否在维度表中创建该课程条目的非标准化版本?
还是我只是将事实表直接加入课程表加入描述该课程的其他表(课程类型,创建该课程的教师等)
4 回答
雪花或桥表确实使连接更加复杂,不仅从编码的角度来看,它还使 BI 用户变得不那么简单。
在大多数情况下,我会将这些直接放在现有的或附加的维度表中。
例如,您有一个分数事实表,它在一个维度中包含用户详细信息,该维度可能包含也可能不包含用户的人口统计数据(也许它只是一个桥梁)。有时最好将人口统计信息分开。因此,即使性别和年龄可能与用户实体相关联,但在维度模型中,这些可能是单独的维度或集中到单个维度中——这一切都取决于使用场景。
也许您的分数附加到一个州,并且州有地区(雪花)。将区域维度直接链接而不是通过状态维度进行分析可能更有效。
我想你会发现维度模型是一种非常实用的非规范化方法。不可协商的主要事情是事实 - 之后维度的选择很大程度上取决于数据的行为,您对常见使用场景的预见 - 并避免陷入维度太少和维度太多的问题。
也许我不明白你的问题,但星型模式中的事实表应该连接到它周围的维度表。如果您不想进行连接,只需创建一个视图,然后使用该视图进行报告。
如果您要发布模型(模式),评论/帮助会更容易。
将多个维度合并在一起是一种常见的做法,牺牲标准化以提高性能。这通常在您的典型查询需要所有维度时完成(而不是针对不同的用例使用不同的位)。
另请记住,虽然您减少了连接开销,但也有一些缺点:
- 失去灵活性,这可能会随着仓库的扩展而阻碍开发
- 全表扫描需要更长的时间(在传统的基于行的 RDBMS 中,例如 SQL Server)
- 磁盘空间消耗
您必须分别考虑每种情况。
如果您的 RDBMS 提供了这种能力,那么考虑创建物化视图的选项可能也是值得的。
我们通常将雪花模式作为物理 DWH 设计,但添加一个报告视图层,将雪花模式扁平化为星型模式。
通过这种方式,您的 OLAP 多维数据集变得更加简单且易于管理。