Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 预订系统的事实表/加载解决方案是什么类型? 背景_Sql Server_Ssis_Sql Server 2012_Data Warehouse_Business Intelligence - Fatal编程技术网

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

Sql server 预订系统的事实表/加载解决方案是什么类型? 背景,sql-server,ssis,sql-server-2012,data-warehouse,business-intelligence,Sql Server,Ssis,Sql Server 2012,Data Warehouse,Business Intelligence,我正在使用SQL Server 2012和SSIS设计一个数据仓库。源系统处理酒店预订。保留分为两个表,标题和标题行项目。事实表将位于行项目级别,包含来自标题的一些数据 问题 我面临的挑战是,预订(及其行项目)可能会随着时间的推移而改变 例如: 预订已创建 房间将添加到预订中(作为标题行项目) 客户到达并将食物/饮料添加到他们的预订中(更多行项目) 将付款添加到预订中(作为行项目) 随后可能会取消房间并从预订中删除(删除行项目) 房间中的人数可能会发生变化,从而影响该行项目 预订状态在其生命周

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

问题 我面临的挑战是,预订(及其行项目)可能会随着时间的推移而改变

例如:

  • 预订已创建
  • 房间将添加到预订中(作为标题行项目)
  • 客户到达并将食物/饮料添加到他们的预订中(更多行项目)
  • 将付款添加到预订中(作为行项目)
  • 随后可能会取消房间并从预订中删除(删除行项目)
  • 房间中的人数可能会发生变化,从而影响该行项目
  • 预订状态在其生命周期的某一点从“临时”更改为“已确认”
最后三点是关键,我不知道如何在不查找记录并更新它的情况下保持该行的更新。业务部门希望跟踪更新和删除

我拒绝更新是因为:

  • 从我所读到的事实表来看,在将行写入表后重新访问行不是一个好的做法
  • 我可以用一个查找组件来实现这一点,但是如果行数超过4500万行,这是最好的方法吗
  • 问题
  • 我应该选择哪种类型的事实表或加载解决方案
  • 我应该更新记录吗?如果是的话,我怎样才能做到最好
  • 我愿意接受任何建议

    其他问题(根据ElectricLlama的回答):

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

  • 如果源代码行和事实之间的比例为1:1,并且在事实中存储了源系统预订代码(没有与之相反的维度建模规则),那么我建议您采用两步加载过程

    <>删除/插入基于预订日期的最后X天预订(或任何你认为是主要事实日期),

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

  • 你只需要考虑这对未来的发展有什么限制,也就是说,当你得到额外的源系统来添加时,你需要保持1:1的事实来保持你的负载过程的一致性。 我从未在数据加载过程中更新过事实记录,但总是删除/插入某个数据域(即,该域可能会拖20天或源系统预订代码)。这实际上与更新相同,但也会考虑删除

    关于审计源代码中的更改,我建议您将其写入一个完全不同的表,而不是主要事实,因为它的目的是审计,而不是分析

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

    无论如何都要避免使用SSIS查找组件,因为它完全无效,并且肯定无法在4500万行上运行

    坚持“插入/删除数据部分”的方法,因为它使SSIS能够插入/删除数据部分(并且无法有效地更新或查找)

    在回答后续问题时:

  • 事实上是1:1的关系 我的意思是,您对任何需要集成的未来系统都不了解,或者对现有源系统的未来升级可能做什么也不了解。这种1:1映射引入了一个设计约束(它实际上不是一个约束,更多的是一个框架)。考虑到这一点,任何新系统都不需要遵循这种特定的负载设计,只要它的数据一致地到达事实中。我认为实施1:1的设计是一个好主意,只是试图考虑任何不利因素。

  • 如果您的源代码有一个可靠的修改日期,那么您很幸运,因为您可以执行差异加载-仅加载更改的记录。我建议你:

  • 将所有最近修改的记录(最近5天?)加载到暂存表中
  • 根据记录键执行删除/插入操作。在执行SQL任务中执行SSI内部的delete操作,不要将数据流按行馈送到delete语句中
  • 审计表:

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

    如果您确实希望将其作为加载过程的一部分捕获,我建议您在暂存表和现有审核表之间进行比较,并只写入新的审核行,即审核表中的保留X上次修改日期为4月2日,但暂存表中的保留X上次修改日期为4月4日,因此,将此更改作为新记录写入审计表。请注意,如果您每天加载,则不会记录其间的任何更改,这就是我建议在源代码中使用触发器和日志的原因

  • 删除/插入事实记录
  • 这是