我正在为有点吱吱作响的OLTP创建DW。

我面临的一个问题是OLTP数据库中没有太多的数据完整性。 一个示例是“郊区”字段。

该郊区字段是OLTP UI上的自由文本字段,这意味着我们在该字段中有值,加上我们有空字符串和NULL值。

我们通常将如何处理? 我提出的方案是:

  1. 按原样导入数据(不理想)
  2. 在我的ETL过程中,将任何空字符串都视为NULL,然后在DW中将其替换为单词“ Unknown”
  3. 在DW中将空字符串和NULL都导入为空字符串

仅供参考,我使用的是Microsoft BI堆栈(SQL Server,SSIS,SSAS,SSRS)

===============>>#1 票数:4 已采纳

简短的答案是,这取决于源系统中NULL和空字符串的含义。

这个通用的问题(处理NULL )已经讨论了很多,例如hereherehere等。我认为要记住的最重要一点是,数据仓库只是一个数据库; 它可能具有非常特殊的模式类型,并且是为一种目的而设计的,但是它仍然只是一个数据库,有关NULL任何常规建议仍然适用。

(作为一个旁注,我有时更喜欢谈论“报告数据库”而不是“数据仓库”,因为它使事情变得更加清晰。一些DBA和开发人员开始为大型服务器场和多年ETL项目制定计划,例如他们一听到“数据仓库”一词,但最终它只是一个报告数据库。)

无论如何,尚不清楚您要在何处使用NULL但看起来它可能是维度上的属性。

我(可能)不会使用您的三种方法中的任何一种,但这取决于您数据的含义。 照原样导入数据没有用,因为数据仓库的部分价值在于数据已被清理且保持一致,这使得沿其他维度进行查询和比较数据变得更加容易。

用'Unknown'替换空字符串可能是正确的,也可能是不正确的:源系统中的空字符串是什么意思? “这意味着没有郊区”和“这意味着我们不知道是否有郊区”之间有很大的区别。 假设一个空字符串表示“无郊区”,而NULL表示“未知”,那么我将按原样导入这些空字符串,但将NULL替换为“ Unknown”。 这样做的主要原因是,如果将Suburb字段用作报表中的过滤条件,则用户(可能还有您的报表工具)更容易使用非NULL值(例如“ UNKNOWN”)。 而且,如果源系统中没有一致性,并且您不知道空字符串和NULL意味着什么,那么您首先需要澄清一下,并且也应该在理想情况下修复源系统(DWH的另一个好处是,它有助于识别不一致之处。和源系统中的数据处理错误)。

NULL转换为空字符串的最后一个想法是相同的问题: NULL在源系统中实际上意味着什么? 如果它表示“无郊区”,则用一个空字符串替换它可能是一个好主意,但是,如果它表示其他内容,则应将其作为其他内容来处理。

综上所述,我的偏好是按原样导入空字符串,并将NULL转换为“ UNKNOWN”,但是我不确定这在您的情况下是否真的有意义。 这个问题没有一个唯一的答案,因为这完全取决于您的特定数据及其含义。 但是在数据仓库(或任何其他数据库)中使用NULL没问题,只要您始终如一地进行操作并且对源系统如何处理数据有清楚的了解。

===============>>#2 票数:1

从语义上讲,NULL通常表示未定义/未知。 而“”空字符串表示该值已知为空。 在您的郊区示例中,NULL可能意味着未知给定记录是否存在郊区,而“”可能意味着对于给定记录肯定没有郊区。

如果在您的情况下NULL和“”的含义相同,则最好在导入DW之前将两个值标准化为相同的值(例如“”),以便以后更轻松地执行报告(以免NULL = 50和“” = 34,并且必须将它们加在一起)。

  ask by Paul translate from so

未解决问题?本站智能推荐: