【问题标题】:Store overlapping date ranges to be filtered using a custom date range使用自定义日期范围存储要过滤的重叠日期范围
【发布时间】:2016-06-14 00:10:35
【问题描述】:

我需要有关如何在我的数据仓库中构建重叠日期范围的帮助。我的目标是以允许对报告进行日期级别过滤的方式对数据进行建模。

我有维度 - DimEmployeeDimDate 和一个名为 FactAttendance 的事实。这个事实中的记录存储如下——

用图形表示——

需要根据这些数据创建报告,最终用户可以通过选择日期范围来过滤它。假设用户选择日期范围 D1 到 D20。在进行此选择时,用户应该看到至少有一名员工休假的天数。在这个特定的示例中,我应该会看到底部添加了浅蓝色段,即 11 天。

我正在考虑的一种方法是在每个员工的每个日期为每个休假存储一行。这种方法的唯一问题是它会以指数方式增加事实表中的记录数。此外,事实中还有其他列会有冗余数据。

仓库中通常如何处理此类重叠的日期/时间问题?有没有更好的方法不涉及插入大量行?

【问题讨论】:

    标签: relational-database data-modeling data-warehouse datadesign


    【解决方案1】:

    考虑像这样对你的事实建模:

    fact_attendance (date_id,employee_id,hours,...)
    

    这将使您能够通过简单地过滤日期维度来回答您的原始问题,但您还可以处理休假积分和小数天休假使用等问题。

    是的,它可能比您的第一个提案使用更多的存储空间,但它是更好的维度表示,并且将满足更多(潜在)要求。

    如果您真的担心存储 - 可能不是真正的担心 - 使用带有列压缩的 DBMS,您会看到大量的磁盘节省。

    我之所以说“不必担心”存储是因为您的储蓄在当今的存储世界中毫无意义。 1,000 名员工每年休假 20 天,超过 5 年意味着总共有 100,000 行。您的 DBMS 可能会在 RAM 中执行整个星形连接。即使是 100 万员工,在压缩之前也需要不到 1 TB。

    【讨论】:

    • 是的,这是我正在考虑的一种方法。但是,事实表中还有其他字段主要是与休假相关的指标,如果我将粒度增加到日期级别,这些字段将在每个日期重复。这将产生处理度量中重复值的开销。
    • 您能否举例说明需要重复的休假相关指标?这将有助于确定候选解决方案。
    • 嗯,一些必须重复的指标是 IsPreApprovedIsLeaveWithoutPay,而其他一些指标确实符合具有日期粒度的表,例如 IsCasualLeaveIsSickLeave
    • 这看起来不太正常。 LeaveWithoutPay、CasualLeave、SickLeave 等应该是 LeaveType 维度的业务键。 IsPreApproved 可能是一个退化维度。
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多