【问题标题】:Normalize a Table That Contains Monthly, Yearly and Quarterly Data规范化包含月度、年度和季度数据的表
【发布时间】:2013-01-31 03:37:03
【问题描述】:

如何规范化这个表:

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

【问题讨论】:

    标签: sql database-design database-normalization


    【解决方案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} 的一个且只有一个值。

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

    【讨论】:

      【解决方案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
      

      这对你有用吗?

      【讨论】:

      • 每年的价值不仅仅是每月价值的总和。使用了我不知道的统计公式。
      • 这是有效的。添加了 Quarter-column。
      猜你喜欢
      • 2020-11-16
      • 2021-03-08
      • 2018-12-20
      • 2023-03-31
      • 2021-01-07
      • 1970-01-01
      • 2020-01-07
      • 2020-07-16
      • 1970-01-01
      相关资源
      最近更新 更多