Ik vroeg me af wat de beste manier is om lege velden uit bronsystemen op te slaan in een datawarehouse. Bijvoorbeeld een klantrecord zonder voornaam in de database. Als ik dit record in mijn datawarehouse laad, moet ik dit veld dan op NULL zetten (om ruimte te besparen) of moet ik de originele waarde laden, misschien een lege string?
Er is geen goed antwoord op deze vraag. Het hangt af van de architectuur en de regels. Gebruik je een Data Vault om je data op te slaan, dan gebruik je altijd de originele waarde uit de bron zonder de data op te schonen. Dat is een regel. Maar na deze data vault komt er een datamart met schone data. Moet ik dit soort waarden op NULL zetten of moet ik lege strings gebruiken?
Mijn ervaring is dat je bij NULL-waarden een regel moet onthouden. Als je velden samenvoegt, bijvoorbeeld voor een adres of een volledige naam, doe je zoiets:
SELECT FirstName + ’ ’ + LastName FROM dbo.Customer
Is de FirstName leeg, dan is het resultaat NULL. Gebruik je NULL als FirstName, dan moet je dus altijd een extra controle doen op lege waarden:
SELECT ISNULL(FirstName,‘’) + ’ ’ + ISNULL(LastName,‘’) FROM dbo.Customer
Een heel belangrijk punt geldt ook voor getallen. Misschien heb je in je datamart drie kolommen voor winst die je in je rapport moet optellen met SUM. Bevat een kolom een NULL-waarde, dan is het resultaat NULL!
Column1 Column2 Column3
3 NULL 2
SELECT Column1 + Column2 + Column3 FROM dbo.Table
Resultaat: 0
De juiste manier:
SELECT ISNULL(Column1,0) + ISNULL(Column2,0) + ISNULL(Column3,0) FROM dbo.Table
Conclusie:
Overweeg om een lege string op te slaan in plaats van een NULL-waarde, om problemen bij het samenvoegen te voorkomen. Overweeg ook om de waarde 0 op te slaan in kolommen die je optelt. Misschien is het een betere oplossing om extra velden met samengevoegde data in de datamart op te slaan!
Veelgestelde vragen
Moet ik NULL of een lege string opslaan in een datawarehouse?
Daar is geen eenduidig antwoord op. Het hangt af van je architectuur en je regels. Houd in een Data Vault de bronwaarde zoals die is. Overweeg in een datamart een lege string voor tekst, om problemen bij het samenvoegen te voorkomen.
Waarom geeft FirstName + ' ' + LastName NULL in SQL Server?
Is een van de waarden NULL, dan is de hele samengevoegde string NULL. Omsluit elk veld met ISNULL(FirstName,'') om een resultaat te krijgen als de voornaam leeg is.
Hoe tel ik kolommen op die NULL kunnen bevatten in T-SQL?
Omsluit elke kolom met ISNULL(Column,0), bijvoorbeeld ISNULL(Column1,0) + ISNULL(Column2,0) + ISNULL(Column3,0). Eén NULL in een gewone optelling maakt het hele resultaat NULL.
Moet ik lege waarden opschonen bij het laden van een Data Vault?
Nee. Gebruik je een Data Vault, sla dan altijd de originele waarde uit de bron op zonder die op te schonen. Dat is een regel. Het opschonen gebeurt later, in de datamart.
Wat sla ik op voor lege waarden in een datamart?
Sla in tekstkolommen een lege string op in plaats van NULL, en de waarde 0 in kolommen die je optelt. Je kunt ook extra velden met de samengevoegde data toevoegen.
Reacties
Gerelateerde blogs
Hoe maak ik een Periode Dimensie?
Alle tabellen in een database leegmaken en de foreign keys behouden: een compleet script
Sneller laden van AS400 naar SQL Server: één kolom per rij