简短的回答是,它取决于NULL
和空字符串在源系统中的含义。
这个一般问题(处理NULL
)已经被讨论了很多,例如, here,here,here等。我认为最重要的一点是数据仓库只是一个数据库;它可能有一个非常特定类型的模式,并且是为一个目的而设计的,但它仍然只是一个数据库,并且仍然适用于任何关于NULL
的一般建议。 (作为一个方面说明,我有时候更喜欢谈论“报告数据库”而不是“数据仓库”,因为它让事情保持透彻,一些DBA和开发人员开始为巨大的服务器群和多服务器群制定计划,但是最终它只是一个报告数据库。)
无论如何,它并不是完全清楚你想使用哪一个NULL
,但它看起来像它可能是维度上的属性。
我(可能)不会使用你的三种方法中的任何一种,但它取决于你的数据的含义。按原样导入数据并不实用,因为数据仓库的部分价值在于数据已被清理并且一致,这使得查询和比较其他维度中的数据变得更加容易。
用'Unknown'替换空字符串可能正确也可能不正确:空字符串在源系统中的含义是什么? “这意味着没有郊区”和“这意味着我们不知道是否有郊区”有很大的区别。假设空字符串表示“没有郊区”,并且NULL
表示“未知”,那么我会将空字符串原样导入,但将NULL
替换为“未知”。这样做的主要原因是,如果Suburb字段将用作报表中的过滤条件,则用户(可能还有报表工具)会更容易使用“UNKNOWN”之类的非NULL
值。如果源系统中没有一致性,并且您不知道空字符串和NULL是什么意思,那么您需要先澄清并理想地修复源系统(DWH的另一个好处是它有助于识别不一致性和源系统中的数据处理错误)。
您最后的想法将NULL
s转换为空字符串是相同的问题:NULL
实际上在源系统中意味着什么?如果它的意思是“没有郊区”,那么用空字符串替换它可能是一个好主意,但如果它意味着别的东西,那么你应该把它当作别的东西来处理。因此,总而言之,我的首选是按原样导入空字符串,并将NULL
转换为“UNKNOWN”,但我无法确定这对您的情况是否有意义。这个问题没有单一的答案,因为这一切都取决于你的具体数据及其含义。但只要您始终如一地执行并清楚了解源系统如何处理数据,在数据仓库(或任何其他数据库)中使用NULL
就没有问题。
为什么NULL在DW中是不可以的?我不明白从70年代开始遵循DW概念的愿望 - 如果出生日期不详,那不是1900-01-01。 –
我可能会同意你的意见。这个问题更多的是关于在OLTP中处理空字符串V NULL的问题 – Paul
这个问题非常类似于您担心在将数据移动到DW之后如何处理这些数据。如果你想纠正源OLTP系统,你应该在问题(和标题)中更加清楚。 –