【发布时间】:2017-03-06 15:38:07
【问题描述】:
我正在尝试使用星型模式为我的数据仓库建模,但在避免事实表之间的连接时遇到了问题。
为了简单地了解我的问题,我想收集在我的操作系统上发生的所有事件。所以,我可以创建一个事实表event,其中包含一些维度,例如datetime 或user。问题是我想收集不同类型的事件:硬件事件和软件事件。
问题是这些事件的维度不同。例如,对于硬件事件,我可以有 physical_component 或 related_driver 尺寸,对于软件事件,software_name 或 online_application 尺寸(这只是一些示例,要记住的想法是事实event 可以专门化为一些特定维度的特定事件。
在关系模型中,我将有 3 个这样组织的表:
问题是:如何在星型模式中处理事实表之间的连接?
我想象了 4 个想法,但我不确定其中一个是否适合这种情况。
第一个是将模型保留在关系数据库中并添加如下维度表:
在这种情况下,问题是事实表之间仍然存在连接,需要在所有查询中使用
JOIN SQL 语句。
第二个是只创建 2 个将复制共享维度(日期时间和用户)的事实表,并创建一个汇总所有事件的物化视图事件:
这里的问题是:如果我想对物化视图进行查询会发生什么?根据我在 Oracle 文档中阅读的内容,我们不必直接在物化视图上进行查询,但我们必须让查询重写过程使其工作。
第三个是只创建一个事实表,该表将包含事件(硬件或软件)的所有可能信息:
这一次,问题是我的事实表将包含很多
NULL 值。
最后一个是创建 3 个事实表(这次没有物化视图),如下所示:
这一次,问题是所有事件都存在于事实表
event 和它自己的表中。因为我们将存储大量数据,所以我不确定这种复制是否是个好主意。
那么最好的解决方案是什么?还是存在第五种解决方案?
【问题讨论】:
-
软件和硬件事件在它们的数据结构中有多相似(内容方面,而不是列名)?如果类似,您可以只使用像“源”这样的单个维度,其中一些共享列和一些非共享列设置为“n/a”,用于它们不适用的类型。
-
@Cyrus 软件和硬件事件的结构(列数)和内容(每个表的列之间没有链接)完全不同。所有共享列都在事件表中。
标签: database-design data-warehouse star-schema