规范化包含月度,年度和季度数据的表

时间:2013-01-30 08:14:34

标签: sql database-design database-normalization

如何规范化此表:

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

该表不是第二范式,因为当Frequency = Yearly Value取决于主键的子集(Frequency,Year)

我很想添加一个代理键。那么Quarter和Month列可以为空。

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

但这并没有解决问题,因为第二范式定义也适用于候选键。根据频率将表分成三个表并不是一个好主意,因为它会将状态引入我的业务逻辑中:

if (frequency == Monthly) then select from DataMonthly

2 个答案:

答案 0 :(得分:1)

我将假设几年的数据可能看起来像这样。如我错了请纠正我。 (我将忽略使用零是一个好主意还是一个坏主意的问题。)

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'中只有一个值?”

  • {年,季度,月} - >频率
  • {Year,Quarter,Month} - > Value

给定属性集{Year,Quarter,Month}的一个值,我们知道属性集{Frequency}的唯一值。并且给定属性集{Year,Quarter,Month}的一个值,我们知道属性集{Value}的唯一值。

您遇到的问题包括“频率”作为主键的一部分。它真的不是。

答案 1 :(得分:0)

此表可能没有[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

这对你有用吗?