使用父行 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 设计事实表的主要内容,如果未能解决你的问题,请参考以下文章