如何规范化此表:
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
答案 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}的一个值,我们知道属性集{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
这对你有用吗?