我正在寻找两种方法来为存储 IT 基础设施数据的数据仓库中的事实表和维度表之间的层次关系建模。
举个例子:
FACT_Folder
- 包含有关文件系统文件夹的事实
Dim_Drive
- 文件夹链接到单个 DRIVE 条目
Dim_Array
- 驱动器链接到单个阵列
Dim_Server
- 阵列链接到单个服务器
Dim_Farm
- 服务器链接到单个农场
出于我们的目的,我们不需要担心文件夹移动到不同的驱动器。
我们希望能够获得此层次结构所有级别的指标。
假设我最终将拥有数百万个文件夹实体(包含每日数据),以及成百上千个驱动器、阵列等;您会推荐哪种设计模式,为什么?
归一化
- A
Folder
链接到 aDrive
,层次结构的其余部分在维度之间
- A
非规格化 I
- A
Folder
链接到 aDrive
,但维度包含每一行的每个条目Drive
的整个层次结构Drive
- A
非规格化 II
- A
Folder
直接链接到层次结构的所有级别
- A
??????
我会在所有/大多数级别进行链接。这个非规范化的星号意味着是的,数据是冗余的,但它通常会使报告和分析变得容易得多。请注意,这与 OLTP 规范化有很大不同,您通常不必担心冗余数据不同步,因为在 DW 场景中数据永远不会更改。添加新事实,维度过期并创建新事实。
我没有看到 Dim_Folder。我假设文件夹的实际路径是 Dim_Folder 的一个属性。只有数字数量和任何退化维度 (http://en.wikipedia.org/wiki/Degenerate_dimension) 会出现在事实表中。我不会将文件夹路径视为退化维度,因为它会在每个快照中不断返回(文件夹不是事务)。
所以你可以这样做:
查看 DIM_Folder 的使用如何使 dim id 集变小,然后,我们假设在快照日期和文件夹 dim id 上有某种索引(反之亦然)。
如果您只想要更高级别的数据,请了解您现在如何根本不需要加入文件夹。由于您通常在 ETL 时就知道所有这些,因此与 OLTP 系统有不同的动机,在 OLTP 系统中,您希望在某些内容发生变化时一切都一起移动(腿骨连接到大腿骨等)。在 DW 场景中,您真的不想移动任何东西。
所以,砰!- 总农场使用分析:
记住星星对于分析来说真的很简单。您永远不需要担心单个非雪花星中的无意交叉连接。连接不同的星星时,您一定要小心。所以大多数情况下的查询在星型模式中要简单得多。没有网络遍历和担心像在规范化模型中那样的多对多关系。