首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化包含月度、年度和季度数据的表

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

Stack Overflow用户
提问于 2013-01-30 16:14:34
回答 2查看 1.5K关注 0票数 1

如何对该表进行规范化:

代码语言:javascript
复制
Frequency (PK)    Year (PK)    Quarter (PK)    Month (PK)    Value
Monthly           2013         1               1             1
Quarterly         2013         1               0             2
Yearly            2013         0               0             3

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

我考虑过添加一个代理键。则季度和月份列可以为空。

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
if (frequency == Monthly) then select from DataMonthly
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-30 17:04:17

这个表可能没有[Frequency][Quarter]列。

你为什么要把这些放进去?在此表中预先计算季度和年值是否有任何附加值?评论:因为它的值不只是它的月份的总和。

所以[Quarter]是强制性的。

这也是可行的:

代码语言:javascript
复制
Year (PK)    Quarter (PK)    Month (PK)    Value
2013         1               1             1
2013         1               0             2
2013         0               0             3

年度业绩:

代码语言:javascript
复制
SELECT 
    [Value] 
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 0 AND [Month] = 0

季度业绩:

代码语言:javascript
复制
SELECT 
    [Value]
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 1 AND [Month] = 0

月度结果:

代码语言:javascript
复制
SELECT 
    [Value] AS [Results] 
FROM [Table1] 
WHERE [Year] = 2013 AND [Quarter] = 1 AND [Month] = 1

这对你有用吗?

票数 0
EN

Stack Overflow用户

发布于 2013-01-31 03:37:03

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

代码语言:javascript
复制
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,
  • ,Month}->Value

给定属性集{Year,Quarter,Month}的一个值,我们知道且仅知道属性集{Frequency}的一个值。给定属性集{Year,Quarter,Month}的一个值,我们知道且只有一个属性集{ value }的值。

您遇到的问题涉及到将"Frequency“作为主键的一部分。真的不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14599362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档