Почему значения NULL отображаются как 0 в таблицах фактов? - PullRequest
5 голосов
/ 28 ноября 2011

В чем причина того, что в полях мер в таблицах фактов (хранилищах с размерным моделированием) значения NULL обычно отображаются как 0?

Ответы [ 4 ]

15 голосов
/ 29 ноября 2011

Хотя вы уже приняли другой ответ, я бы сказал, что использование NULL на самом деле является лучшим выбором по нескольким причинам.

Первая причина заключается в том, что агрегаты возвращают «правильный» ответ (т. Е. Тот, который пользователи обычно ожидают), когда присутствует NULL, но дают «неправильный» ответ, когда вы используете ноль. Рассмотрим результаты AVG () в этих двух запросах:

-- with zero; gives 1.5
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select 0
) dt

-- with null; gives 2
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select null
) dt

Если мы предположим, что показателем здесь является «количество дней на изготовление изделия», а NULL представляет изделие, которое все еще производится, то ноль дает неправильный ответ. То же самое относится и к MIN () и MAX ().

Вторая проблема заключается в том, что если ноль является значением по умолчанию, то как вы различаете ноль в качестве значения по умолчанию и ноль в качестве реального значения? Например, рассмотрим меру «транспортные расходы в евро», когда NULL означает, что клиент сам принял заказ, поэтому не было никаких расходов на доставку, а ноль означает, что заказ был отправлен клиенту бесплатно. Вы не можете использовать ноль для замены NULL без полного изменения значения данных. Вы, очевидно, можете утверждать, что это различие должно быть четким по сравнению с другими измерениями (например, методом доставки), но это увеличивает сложность отчетов и понимания данных.

5 голосов
/ 28 ноября 2011

Это зависит от того, что вы моделируете, но в целом это позволяет избежать сложностей с выполнением агрегатов. И во многих сценариях имеет смысл рассматривать NULL как 0 для этих целей.

Например, клиент с NULL заказами на данный период времени. Или продавец с NULL доходом от продаж (позор ему!).

1 голос
/ 29 ноября 2011

Основная причина в том, что база данных обрабатывает нули иначе, чем пробелы или нули , даже если они выглядят как пробелы или нули для человеческого глаза.

Вот ссылка на совет по старому дизайну Ральф Кимбалл на ту же тему.

В этом посте говорится оизбегая нулей в мерах и дает пару предложений.

0 голосов
/ 27 октября 2016

NULL вместо 0 следует использовать, если вы намерены получить среднее значение в столбце фактов.Это единственный раз, когда я верю, что NULLS в порядке в факте или измерениях DWH

, если значение факта неизвестно / поступает поздно, тогда лучше всего оставить NULL.

агрегатные функции, такие как MIN, MAX работают над NULLS, просто игнорируя их

(для записи один из корешей Ральфа Кимбалла сказал это в своем курсе, который я намеревался)использует ноль неизвестного значения как буквально 0

...