1

如何规范化此表:

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

该表不是第二范式,因为当频率 = 年度值取决于主键的子集(频率、年份)

我想添加一个代理键。然后 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 语句:

if (frequency == Monthly) then select from DataMonthly
4

2 回答 2

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} 的一个值,我们知道属性集 {Frequency} 的一个且只有一个值。并且给定属性集 {Year, Quarter, Month} 的一个值,我们知道属性集 {Value} 的一个且只有一个值。

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

于 2013-01-30T19:37:03.467 回答
0

该表可能没有[Frequency]and[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

这对你有用吗?

于 2013-01-30T09:04:17.110 回答