アカウントで収集するための1日のコストを追跡する何かを作成するように求められ、これをサポートするデータベーステーブルスキーマを見つけようとしています。
これが私が知っていることです
- 会社は250万以上のアカウントを持っています
- これらのうち、彼らは現在、1か月あたり平均20万人働いています(現在は低い人員配置レベルで変化します)
- 追跡したい13の異なるコストタイプがあり、将来さらに追加する可能性があると警告しています。
- コストを毎日追跡したい
- コストは在庫全体に分割されません。それらは、1か月あたり働くアカウント数(200,000)に分割されるか、ユーザーがアカウント識別子を入力してアカウントのグループにコストを適用するか、単にコストを適用するアカウントを指定できます。
最初に考えたのは、正規化されたデータベースです。
アカウントID 日付 CostTypeId 量
これに関する私の問題は、数学をすることです。このテーブルはすぐに巨大になります。13のすべてのコストタイプが今月のすべての作業済みアカウントに適用されると仮定すると200k * 13 * N days in month
、これは1か月あたり約7500〜8000万レコード、または1年あたり約10億レコードになります。
私の2番目の考えは、それを少し非正規化することでした
アカウントID 日付 総費用 CostType1 CostType2 CostType3 CostType4 CostType5 CostType6 CostType7 CostType8 CostType9 CostType10 CostType11 CostType12 CostType13
この方法はより非正規化されており、1か月あたり最大600万レコード(200k * N days in month
)、または1年あたり約7,200 万レコードを作成できます。最初の方法よりもはるかに少ないですが、将来会社が新しいコストタイプを決定した場合は、別のデータベース列を追加する必要があります。
2つの方法のうち、どちらがお好みですか?どうして?これをより良く処理できると考えられる別の選択肢はありますか?
私は、要約レポートと詳細レポートの両方のパフォーマンスのレポートに最も興味があります。アカウントに費用を配分するジョブは、誰もいないときに夜間に実行されます。二次的な懸念は、データベースのサイズです。既存のデータベースはすでに約300 GBであり、ディスク上のスペースは約500 GBであると思います。
データベースはSQL Server 2005です