JNK*_*JNK 5 data-warehouse database-design
我正在研究两种方法来为数据仓库中的事实表和维度表之间的层次关系建模,以存储 IT 基础架构数据。
举个例子:
FACT_Folder
Dim_Drive
Dim_Array
Dim_Server
Dim_Farm
出于我们的目的,我们不需要担心文件夹移动到不同的驱动器。
我们希望能够获得该层次结构所有级别的指标。
假设我最终将拥有数百万个文件夹实体(包含日常数据),以及成百上千个驱动器、阵列等;你会推荐哪种设计模式,为什么?
归一化
Folder
指向 a的链接Drive
,层次结构的其余部分位于维度之间非规范化 I
Folder
指向 a的链接Drive
,但Drive
维度包含Drive
每一行的每个条目的整个层次结构非规范化 II
Folder
直接链接到层次结构的所有级别??????
我会链接所有/大多数级别。这个非规范化的星号意味着是的,数据是冗余的,但它通常会使报告和分析变得更加容易。请注意,这与 OLTP 规范化非常不同,您通常不必担心冗余数据不同步,因为在 DW 场景中数据永远不会改变。添加新事实,维度过期并创建新事实。
我没有看到 Dim_Folder。我会假设文件夹的实际路径是 Dim_Folder 的一个属性。只有数字数量和任何退化维度 (http://en.wikipedia.org/wiki/Degenerate_dimension) 才会出现在事实表中。我不会将文件夹路径视为退化维度,因为它会在每个快照中不断返回(文件夹不是事务)。
所以你可以做这样的事情:
SELECT AVG(bytes_on_disk)
FROM FACT_Folder
INNER JOIN DIM_Folder
ON FACT_Folder.FolderDimID = DIM_Folder.DimID
INNER JOIN DIM_Date
ON FACT_Folder.SnapshotDateID = DIM_Date.DateID
WHERE DIM_Date.Date BETWEEN '20120101' AND '20121231'
AND DIM_Folder.FolderPath = '/usr/bin/'
Run Code Online (Sandbox Code Playgroud)
看看 DIM_Folder 的用法如何使一组 dim id 变小,然后,我们假设快照日期有某种索引,然后是文件夹 dim id(反之亦然)。
如果您只想要更高级别的数据,看看您现在如何根本不需要加入文件夹。由于您通常在 ETL 时就知道所有这些,因此与 OLTP 系统中的动机不同,在 OLTP 系统中,您希望所有内容在发生变化时一起移动(腿骨连接到大腿骨等)。在 DW 场景中,您真的不想移动任何东西。
所以,砰!- 农场总使用量分析:
SELECT DIM_Farm.Farm_Name, SUM(bytes_on_disk)
FROM FACT_Folder
INNER JOIN DIM_Farm
ON FACT_Folder.FarmDimID = DIM_Farm.DimID
INNER JOIN DIM_Date
ON FACT_Folder.SnapshotDateID = DIM_Date.DateID
WHERE DIM_Date.Date BETWEEN '20120101' AND '20121231'
GROUP BY DIM_Farm.Farm_Name
Run Code Online (Sandbox Code Playgroud)
请记住,星星对于分析来说非常简单。您永远不需要担心在单个非雪花星中无意中交叉连接。当链接不同的星星时,你必须小心。因此,大多数情况下的查询在星型模式中要简单得多。没有网络遍历,也不像在规范化模型中那样担心多对多关系。
归档时间: |
|
查看次数: |
1195 次 |
最近记录: |