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

Frequency = Yearly の場合、値は主キーのサブセット (Frequency、Year) に依存するため、表は第 2 正規形ではありません。

代理キーを追加することを考えました。次に、Quarter 列と Month 列を NULL 可能にすることができます。

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

しかし、これでは問題は解決しません。なぜなら、第 2 正規形の定義は候補キーにも適用されるからです。頻度に基づいてテーブルを 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

そのデータから、2つの機能依存性を推測できます。関数従属性は、「属性のセット「X」に1つの値が与えられた場合、属性のセット「Y」に1つだけの値を知っていますか?」という質問に答えます。

  • {年、四半期、月}->頻度
  • {年、四半期、月}->値

属性のセット{Year、Quarter、Month}に1つの値が与えられると、属性のセット{Frequency}に1つの値しかわかりません。また、属性のセット{Year、Quarter、Month}に1つの値が与えられると、属性のセット{Value}に1つの値しかわかりません。

主キーの一部として「周波数」を含む、あなたが遭遇した問題。本当にそうではありません。

于 2013-01-30T19:37:03.467 に答える
0

[Frequency]この表は、おそらくand[Quarter]列がなくても実行できます。

なぜこれらを入れたいのですか?この表で四半期ごとおよび年ごとの値を事前に計算することに付加価値はありますか? コメント: Value は Month の合計だけではありません

必須[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 に答える