使用父行 ID 设计事实表

Posted

技术标签:

【中文标题】使用父行 ID 设计事实表【英文标题】:Designing fact table with parent row IDs 【发布时间】:2014-02-09 20:19:24 【问题描述】:

我一直致力于我的第一个数据仓库设计,遇到了一个我无法找到答案的问题。

我的事实表中的每一行都需要标识“父”记录的 RowID。就我而言,每个装运事件都会导致后续事件属于该行。如果产品被重新发货,则以下产品属于该新行,依此类推。

但是,由于各种原因,并非所有产品都有发货历史记录。因此将这些行设为空。

我的事实表中的每一行都有一个唯一的 id,所以我可以引用它,但是我应该在哪里存储这个关系呢?我是否在 ParentRowId 的事实表中添加一个可为空的列?我是否要创建一个无事实的事实表来定义关系?

我倾向于第一个选项,但不确定在这种情况下什么是“合适的”。如果这对 SQL Server 2012 有影响的话,看看每年大约 300 万行。

【问题讨论】:

每年有 300 万行,性能和存储似乎不是您关心的问题。 @usr 不管怎样,我还是想了解正确的方法 我不能很好地理解你的例子。你的事实表的粒度是什么?是出货吗?是出货历史吗?在任何情况下,事实表中的空键都不是“正确的”。 @mombo 谷物是单个单元(序列号)的事件。因此,一系列事实将是 Shipment > Return > Shipment > Claim > Claim > Return > Shipment > Claim... 8 个事实。尽管正如我所说,这是理想的,因为可能不存在 Shipment,因此为什么会存在 null 【参考方案1】:

我总是建立一个单独的表来做“桥接表”、“覆盖表”和类似的事情。无论如何,您都必须进行联接(自联接)才能找到父级,因此将该联接加入到负责保持这种关系的表中并没有什么坏处。

【讨论】:

以上是关于使用父行 ID 设计事实表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:如何将子项的 SUM() 值更新为同一表中的父行?

根据之前删除的子行删除父行

每个父行的随机基数

总和和不同计数措施(星型模式设计公案)

数仓设计--事实表

如何设计和处理事实表的指数增长?