事实表外键为空?

ako*_*ian 10 data-warehouse database-design

我是数据集市设计的新手,需要澄清一些概念。

我已经阅读了一些关于维度建模的内容,我看到事实表存储了对维度表的外键引用。

现在假设我有一个电话号码维度表和一个 phone_extension 维度表。(这些表格有不同的细节,因此我无法将它们组合起来)

据我了解,这两个维度表都将具有整数主键以获得更好的性能,事实表将具有自己的整数主键并存储对这些维度表的外键引用。

但是假设我遇到了一种情况,即并非所有电话号码都有与之相关的 phone_extension。(有些电话号码不需要分机)

对于具有扩展名的电话号码,事实表将有两个维度表的外键引用,但是我如何捕获只有电话号码而没有扩展名的情况(反之亦然,即没有电话号码的扩展名) ?

我是否应该使用事实表中的电话号码 FK 捕获此类信息,该电话号码具有值和 phone_extension 外键为空?或者这些不相关的对象没有记录在事实表中?

我还需要生成这个数据集市的报告。那么我是从查询事实表并检索维度键值开始还是直接从维度表中报告?

感谢您花时间阅读本文!!
感谢任何帮助!

Joe*_*own 11

如果这些维度未知或不适用,您可以将某些维度表的 FK 保留为 NULL。您只需要记住在执行报告查询时使用外部联接。

或者,有些人为数据集市维度创建“none”和/或“n/a”维度记录,然后填充事实表 FK 以指向这些而不是使用 NULL。这样做的人喜欢这种方法,因为他们厌恶外连接。

在事实表中使用 NULL FK 的人通常会厌恶那些拥有外连接版本的人。;)(换句话说,这是一个可能引发宗教战争的文体问题)

我说做任何你喜欢的,但选择一种方法并坚持下去。


nvo*_*gel 10

不要在仓库或集市中放置空值。

仓库应该很好地规范化(至少是 BCNF),因此应该排除空值。如果数据源中存在空值,则它们可能会保留在临时表中,但仓库本身不需要它们。

Marts 应该被设计为支持展示工具和用户查询。空值只是妨碍了这些事情,因为它们从不显示,并且它们使用户查询更加复杂且容易出错 - 特别是在经常受连接影响的外键列中。