Database design 数据仓库中每个事实的开始和结束期间
我被要求向我们的数据仓库添加一个新表。目前,我们将事实分为月度、季度和年度表格,每个表格都有时间维度。每个事实记录都有一个时间值。数据在源系统中按开始和结束期间生成,结束日期成为事实记录的时间维度值。事实流入月、季或年事实表告诉我们如何理解记录中的日期以及如何使用它们 我被要求让新表在每条记录中包含开始和结束日期。我被告知,这违反了数据仓库原则,但它更好地代表了数据生成的方式,并允许更灵活地查询数据,例如滚动期间等 我不是数据仓库专家。我知道每个事实的单一时间维度是一个原则。我的问题是,违反这一原则的后果是什么?换句话说,反对这样做的理由是什么?在这样做的过程中,我将来可能会面临哪些问题?在我看来,为每一个事实设定开始和结束时间确实能更好地表示数据,但我承认我知道的还不够充分,无法充分评估这种设计选择的含义。也许有人能提供一些前瞻性的建议吗 编辑:Database design 数据仓库中每个事实的开始和结束期间,database-design,data-warehouse,Database Design,Data Warehouse,我被要求向我们的数据仓库添加一个新表。目前,我们将事实分为月度、季度和年度表格,每个表格都有时间维度。每个事实记录都有一个时间值。数据在源系统中按开始和结束期间生成,结束日期成为事实记录的时间维度值。事实流入月、季或年事实表告诉我们如何理解记录中的日期以及如何使用它们 我被要求让新表在每条记录中包含开始和结束日期。我被告知,这违反了数据仓库原则,但它更好地代表了数据生成的方式,并允许更灵活地查询数据,例如滚动期间等 我不是数据仓库专家。我知道每个事实的单一时间维度是一个原则。我的问题是,违反这一
我很欣赏这些答案。他们至少告诉我,这并不像我所认为的那样糟糕。关于日期,我将澄清一点:它们并不代表有效期,而是一个聚合期。因此,事实记录可能代表某一成分在任意月份内使用的平均磅数。不知道这是否有什么区别,但确实如此。记录开始和结束日期的优点是,您可以更容易地表示非统一的时间段。这意味着您可以更轻松地联接、聚合和比较以不同粒度记录的数据。从你的描述来看,你的提议似乎没有什么根本上的“错误”。我以前也做过类似的事情
我发现表中时间段的最佳模型是使用半开放区间。即:间隔是由StartDate>=x
每个事实表都有一个粒度。事实表的粒度指定表中每一行表示的内容——一个事务或某种聚合(每日、每周、每月..) 我假设您当前的表是聚合表,聚合表中的每条记录都有一个指向日期维度的外键,该维度指向时段结束。例如,每周汇总表中的每条记录每周有一行,并指向一周的最后一天(周六或周日)。请注意,在这段时间的开始使用另一个键是多余的
现在,如果您希望允许周期报告的灵活性,那么您应该考虑一个事务的表<强>粒度< /强>,换言之,表中的一行应该是一个事务,并且任何日期/时间FK指向实际事务的时间。< /P> 错误的方法是在同一张表中混合谷物。考虑下面的
FromDateKey ToDateKey Amount
20110327 20110402 700.0
20110329 20110330 200.0
任何包含两行的sum()
,都会对已经包含在第一行中的第二个条目进行双重计数
总而言之,如果您的月度、季度和年度汇总不够好,只需引入一个粒度更细的事实表,即一天汇总或一笔交易。好的。这是我处理相同要求的方式。我使用记录事件日期的新日期字段模拟对事实表的调整 例如,从上面 EventDateKey金额记录类型 20110327 700.0来源 20110329-500.0 DW调整
因此,如果需要聚合(求和)数据,可以使用EventDateKey并通过相同的日期维度处理任何期间。这很复杂,因为您正在模拟对事实表的调整,但它提供了您所需的所有灵活性,同时又不丢失任何信息。我同意:获取这本书。谢谢你的回复。达米尔,看我的编辑。这些记录实际上是聚合的。我确实理解您关于维护粒度的说法。问题是,一个给定数字的粒度实际上可能是两个月,因为源系统允许用户定义他们的报告,而报告是事实的来源。我想这就是为什么他们要求提供有开始和结束日期的事实。是的,任何总和都会包括上面两行,除非总和是开始和结束期间的特定组合,这对我们来说永远都是如此。@Henry--呃,呃,也一样