Нормализуйте таблицу, содержащую месячные, годовые и квартальные данные

Как мне нормализовать эту таблицу:

Frequency (PK)    Year (PK)    Quarter (PK)    Month (PK)    Value
Monthly           2013         1               1             1
Quarterly         2013         1               0             2
Yearly            2013         0               0             3

Таблица не находится во 2-й нормальной форме, потому что когда частота = годовое значение зависит от подмножества первичного ключа (частота, год)

Я подумал о добавлении суррогатного ключа. Тогда столбцы «Квартал» и «Месяц» могут быть нулевыми.

Surrogate (PK)    Frequency    Year    Quarter     Month     Value
1                 Monthly      2013    1           1         1
2                 Quarterly    2013    1           NULL      2
3                 Yearly       2013    NULL        NULL      3

Но это не решает проблему, потому что определение 2-й нормальной формы также применяется к ключам-кандидатам. Разделение таблицы на три таблицы на основе частоты не кажется хорошей идеей, потому что это введет операторы if в мою бизнес-логику:

if (frequency == Monthly) then select from DataMonthly

person hidarikani    schedule 30.01.2013    source источник


Ответы (2)


Эта таблица, вероятно, могла бы обойтись без столбцов [Frequency] и [Quarter].

Почему вы хотите, чтобы они были внутри? Есть ли дополнительная ценность в предварительном расчете квартальных и годовых значений в этой таблице? Комментарий: поскольку его значение не просто сумма его месяцев.

Так что [Quarter] является обязательным.

Это тоже будет работать:

Year (PK)    Quarter (PK)    Month (PK)    Value
2013         1               1             1
2013         1               0             2
2013         0               0             3

Годовые результаты:

SELECT 
    [Value] 
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 0 AND [Month] = 0

Квартальные результаты:

SELECT 
    [Value]
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 1 AND [Month] = 0

Ежемесячные результаты:

SELECT 
    [Value] AS [Results] 
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 1 AND [Month] = 1

Будет ли это работать для вас?

person Jacco    schedule 30.01.2013
comment
Годовое значение — это не просто сумма месячных значений. Используются статистические формулы, о которых я не знаю. - person hidarikani; 30.01.2013
comment
Это действительно. Добавлен квартальный столбец. - person Jacco; 30.01.2013

Я собираюсь предположить, что данные за пару лет могут выглядеть примерно так. Поправьте меня если я ошибаюсь. (Я собираюсь проигнорировать вопрос о том, является ли использование нулей хорошей или плохой идеей.)

Frequency    Year    Quarter     Month     Value
--
Monthly      2012    1           1         1
Monthly      2012    1           2         2
Monthly      2012    1           3         3
Monthly      2012    2           4         4
Monthly      2012    2           5         5
Monthly      2012    2           6         6
Monthly      2012    3           7         7
Monthly      2012    3           8         8
Monthly      2012    3           9         9
Monthly      2012    4           10        10
Monthly      2012    4           11        11
Monthly      2012    4           12        12
Quarterly    2012    1           0         2
Quarterly    2012    2           0         5
Quarterly    2012    3           0         8
Quarterly    2012    4           0         11
Yearly       2012    0           0         3
Monthly      2013    1           1         1
Monthly      2013    1           2         2
Monthly      2013    1           3         3
Monthly      2013    2           4         4
Monthly      2013    2           5         5
Monthly      2013    2           6         6
Monthly      2013    3           7         7
Monthly      2013    3           8         8
Monthly      2013    3           9         9
Monthly      2013    4           10        10
Monthly      2013    4           11        11
Monthly      2013    4           12        12
Quarterly    2013    1           0         2
Quarterly    2013    2           0         5
Quarterly    2013    3           0         8
Quarterly    2013    4           0         11
Yearly       2013    0           0         3

Из этих данных мы можем вывести две функциональные зависимости. Функциональная зависимость отвечает на вопрос: «Учитывая одно значение набора атрибутов «X», знаем ли мы одно и только одно значение набора атрибутов «Y»?

  • {Год, Квартал, Месяц}-> Частота
  • {Год, Квартал, Месяц}-> Значение

Имея одно значение набора атрибутов {Год, Квартал, Месяц}, мы знаем одно и только одно значение набора атрибутов {Частота}. И по одному значению набора атрибутов {Год, Квартал, Месяц} мы знаем одно и только одно значение набора атрибутов {Значение}.

Проблема, с которой вы столкнулись, включала в себя «Частоту» как часть первичного ключа. Это действительно не так.

person Mike Sherrill 'Cat Recall'    schedule 30.01.2013