2009-06-10 91 views
6

我想询问您的意见,以便处理与数据仓库和SSIS/SSAS相关的空值或空值数据的最佳做法。处理数据仓库中的空值

我有几个事实和维度表在不同的行中包含空值。

具体细节:

1)什么是处理空的日期/时间值的最佳方式是什么?我应该在我的时间或日期维度中创建一个“默认”行,并在发现空时将SSIS指向默认行?

2)什么是最好的方式来处理尺寸数据内的空值/空值。例如:“账户”维度中的某些行在“账户名称”列中有空(非空值)值。我应该将这些列中的空值或空值转换为特定的默认值吗?

3)类似于上面的第1点 - 如果我最终得到一个在维度列中没有记录的Facttable行,该怎么办?如果发生这种情况,我是否需要每个维度的默认维度记录?

4)有关如何在Sql服务器集成服务(SSIS)中处理这些操作的任何建议或提示?最好的数据流配置或使用最佳转换对象将会有所帮助。

感谢:-)

回答

4

由于以前的答案州有可以连接到NULL值的尺寸许多不同的含义,未知的,不适用,未知等,如果它能够在应用程序中添加“来区分他们是有用的伪“维度条目可以提供帮助。

在任何情况下,我会避免有空的事实外键或维度字段,甚至有一个'未知'维值将帮助您的用户定义查询,其中包括数据质量不是100 %(而且从不)。

我一直在使用的一个非常简单的技巧,并没有咬我,但是在T-sql中使用int IDENTITY(1,1)来定义我的维代理键(从1开始,每增加1行)。伪密钥(“不可用”,“未分配”,“不适用”)定义为负整数,并由在ETL过程开始时运行的存储过程填充。

例如一个表创建为


    CREATE TABLE [dbo].[Location] 
    (
     [LocationSK] [int] IDENTITY(1,1) NOT NULL, 
     [Name] [varchar](50) NOT NULL, 
     [Abbreviation] [varchar](4) NOT NULL, 
     [LocationBK] [int] NOT NULL, 
     [EffectiveFromDate] [datetime] NOT NULL, 
     [EffectiveToDate] [datetime] NULL, 
     [Type1Checksum] [int] NOT NULL, 
     [Type2Checksum] [int] NOT NULL, 
    ) ON [PRIMARY] 

和存储的过程来填充该表与


Insert Into dbo.Location (LocationSK, Name, Abbreviation, LocationBK, 
         EffectiveFromDate, Type1Checksum, Type2Checksum) 
      Values (-1, 'Unknown location', 'Unk', -1, '1900-01-01', 0,0) 

我已规则以具有每个维度,其是至少一种这样的伪行在维度查找失败的情况下使用,并构建异常报告以跟踪分配给这些行的事实数量。

+0

有趣的 - 你遇到过SSAS的问题,以适应负面的身份值?我知道,当我以前有一个0值作为身份时,SSAS很讨厌。 – rrydman 2009-06-12 01:41:39

1
  1. null或从适当的意义你日期维度保留ID。记住NULL真的可以有很多不同的含义,它可能是未知的,不适用的,无效的等

  2. 我宁愿空字符串(而不是NULLable),但在我正在处理的项目现在将空字符串转换为NULL并允许它们在数据库中。一个潜在的问题要讨论的是,一个空白的中间初始(没有中间名,所以中间初始已知是空的)不同于未知的中间初始或类似的语义。对于金钱来说,我们的模型允许NULL - 我在事实中遇到了一个很大的问题,因为通常它们应该是0,它们总是用作0,并且它们总是必须用ISNULL()来包装。但是由于将空字符串转换为NULL的ETL策略,它们被设置为NULL - 但这只是固定宽度的传输文件格式的产物,它在某些源系统中具有空格而不是0。

  3. 我们的事实表通常有一个PK基于所有的尺寸,因此这将不会被允许 - 它会被链接到一个假的或未知的维度

  4. 在SSIS中我犯了该修剪的装饰构件,所有字符串末尾的空格。我们通常不得不在SSIS中进行很多日期验证和转换,这在组件中是最好的。

1

感谢您的输入,

两件事情我已经在我的最新项目完成是:二手史蒂夫的关于未知/特殊尺寸值负号键建议

1)。这一切都很完美,并且在SSAS多维数据集构建过程中没有出现问题。

2)创建的变换,以检查是否一个值为空,并且如果是这样,则转换为任一-1(在尺寸未知记录),或者如果它是一个测量值,转换到0的表达如下所示作为实例(我用这些在派生列转换):

ISNULL(netWeight) ? 0 : netWeight // This is an example of a Measure column 
ISNULL(completeddateid) ? -1 : completeddateid // This is an example of a dimension key column 

希望这可以帮助别人,将来;-)

0

另一种解决方案我可以建议其他人在该ETL-step期间转移表定义的进口记录成在所有必要的转换之后暂时存储。 我会添加一些额外的属性到该转让表允许某人;在可以为NULL或其他不需要的值的原始值属性旁边;插入标识问题的“编码”值和出现错误值的属性名称。

这样做之后,我仍然可以决定如何在后面的步骤中使用非规格化和传输的数据......可能会滤除错误值或在单独的错误维度中提及它们以包含在报告中,指出哪些值是不正确的以及他们如何/可能会影响汇总价值。

例如

error-code attribute= -1 = NULL date -2 = NULL numerical value -3 = NULL PK -4 = NULL text value 

和其他属性= IdOrderBirthDateOrderAmount

你当然是如果记录可以有超过1错误(NULL)值多了很多麻烦,但在这种情况下,可以扩大“追踪”属性的数量或“返回源”,找出问题发生的地点和原因(与开发部门一起)。)

这是一个有点涉及的步骤,但为了完整性和正确性,我认为这是不可避免的和必要的,否则可能会遇到严重聚集的信息。

也许这也会帮助某人;)