什么类型的事实表/加载解决方案的预订系统?

时间:2014-04-02 08:35:31

标签: sql-server ssis sql-server-2012 data-warehouse business-intelligence

背景

我正在使用SQL Server 2012和SSIS设计数据仓库。源系统处理酒店预订。预订分为两个表,标题和标题行项。事实表将位于订单项级别,其中包含标题中的一些数据。

问题

我面临的挑战是预订(及其订单项)会随着时间的推移而改变。

一个例子是:

  • 预订已创建。
  • 预订中添加了一个房间(作为标题行项目)。
  • 顾客到达并在预订时添加食物/饮料(更多订单项)。
  • 付款已添加到预订中(作为订单项)。
  • 随后可以取消房间并从预订中删除(删除订单项)。
  • 会议室中的人数可能会发生变化,影响该订单项。
  • 预订状态从"临时"到"确认"在其生命周期的某个阶段。

最后三点是关键,我不确定如何在不查找记录并更新记录的情况下更新该行。该公司希望跟踪更新和删除。

我拒绝更新,因为:

  1. 从我读过的关于Fact表的内容来看,一旦将行写入表中,就不好重新访问行。
  2. 我可以使用查找组件执行此操作但行程超过4500万行,这是最好的方法吗?
  3. 问题

    1. 我应该选择什么类型的Fact表或加载解决方案?
    2. 我应该更新记录,如果是这样,我怎样才能做到最好?
    3. 我愿意接受任何建议!

      其他问题(以下来自ElectricLlama的回答):

      1. 事实上与源有1:1的关系。您谈到了对未来发展的可能限制。你能详细说明我将面临的限制类型吗?
      2. 每个订单项都会有一个修改过的(和创建日期)。您是说我应该从事实表中删除自上次导入后已修改的所有记录并再次添加(听起来合乎逻辑)?
      3. 如果对2的回答是"是"然后出于审计目的,我会在删除之前将当前事实记录写入单独的表吗?
      4. 在第一点中,您提到根据预订日期删除/插入最近x天的预订。我可以理解插入新的预订。我只是想了解为什么要删除?

2 个答案:

答案 0 :(得分:2)

如果您在源代码行和事实之间有效地存在1:1,并且您将源系统预订代码存储在事实中(没有针对该系统的维度建模规则),那么我建议您进行两步加载过程。

  1. 根据预订日期(或您认为是主要事实日期的任何内容)删除/插入最近x天的预订,

  2. 根据所有已更改的来源预订代码删除/插入(您当然必须事先知道)

  3. 您只需要考虑这对未来开发的约束,即当您需要添加其他源系统时,您需要保持1:1的事实来源线关系,以保持您的加载过程一致。

    从未更新dataload进程中的事实记录,但始终删除/插入某个数据域(即该域可能落后20天或源系统预订代码)。这实际上与更新相同,但也负责删除。

    关于审核来源的变化,我建议你把它写到一个不同的表中,而不是主要的事实,因为它的目的是审计,而不是分析。

    识别源中已更改记录的要求(用于数据加载和审计)意味着您需要在源中创建触发器和日志表,或者如果可能,则需要启用本机SQL Server CDC。

    不惜一切代价避免使用SSIS查找组件,因为它完全无效,肯定无法在4500万行上运行。

    坚持使用'插入/删除数据部分'方法,因为它有助于SSIS插入/删除(以及无法有效更新或查找)

    回答后续问题:

    1. 实际上是1:1的关系 我所得到的是,您对未来需要集成的系统没有任何可见性,或者对未来升级到现有源系统的可能性有任何可见性。这种1:1映射引入了设计约束(它实际上不是约束,更像是框架)。考虑到这一点,任何 new 系统都不需要遵循这种特定的负载设计,只要它的数据一致地到达事实。我认为实施这个1:1设计是一个好主意,只是试图考虑任何缺点。

    2. 如果您的来源有可靠的修改日期,那么您很幸运,因为您可以进行差异加载 - 仅加载更改的记录。我建议你:

      1. 将所有最近修改的记录(最近5天?)加载到临时表
      2. 根据记录键执行DELETE / INSERT。在执行SQL任务中执行SSIS内部的删除操作,不要把数据流提供给逐行删除语句。
    3. 审核表:

    4. 最简单,最准确的方法是在源系统中实现触发器和日志,并将其与星型模式完全分开。

      如果您确实希望将此捕获作为加载过程的一部分,我建议您在临时表和现有审计表之间进行比较,并仅编写新的审计行,即审计表中的预约X最后修改日期为2 4月,但是登台表中的预约X最后修改日期是4月4日,因此将此更改作为新记录写入审计表。请注意,如果您执行每日加载,则不会记录其间的任何更改,这就是我在源中建议触发器和日志的原因。

      1. 事实上删除/插入记录
      2. 这更多的是确保你的加载过程中有一个重叠的窗口,这样如果过程失败了几天(就像他们一直这样),你就会有一些意外情况,它会无缝地选择回程一旦它再次运作起来。这在您的情况下并不是那么重要,因为您有一个修改日期来识别差异变化,但通常我会选择一个交易日期并删除,比如说7个结束日。这意味着我的加载过程可以持续6天,如果我在第7天修复它,一切都将正确重新加载,无需额外的干预来加载中间日。

答案 1 :(得分:0)

我建议删除一个标志并更新而不是删除。你的表现也会更好。

这将使您能够分析预订在一段时间内的变化情况。您需要确保在所有分析中使用此标志,以确保不会产生混淆。