簡短的回答是,它取決於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系統,你應該在問題(和標題)中更加清楚。 –