現在、毎月の売上高を含むファクト テーブルがあるとおっしゃいました。つまり、顧客ごとに 1 か月に 1 つのレコードです。したがって、このファクト テーブルの各レコードは、実際には、対応するディメンションでその月に発生した個々の売上 "トランザクション" の集計です。
したがって、特定の月に、顧客 123 に対してそれぞれ $10 の 5 つの個別の販売トランザクションが存在する可能性があります...そして、個々の販売トランザクションはそれぞれ別の営業担当者 (A、B、C、D、E) によって処理される可能性があります。あなたが記述したファクト テーブルには、顧客 123 に対して 50 ドルのレコードが 1 つあります...しかし、SalesReps (ABCDE) をどのようにモデル化しますか?
あなたの目標に基づいて...
- 特定の販売事実の時点で、どの販売担当者が顧客の責任者であったかの履歴を維持できるようにするため
- 特定の販売事実の時点で販売担当者のオフィスがどこにあったかを知るため
- 特定の販売事実の時点での顧客の組織の規模を知る
...より低い粒度でモデル化する方が簡単だと思います...特に、販売トランザクションごとに 1 レコードの粒度を持つ販売トランザクション ファクト テーブルです。各販売トランザクションには、1 人の顧客と 1 人の営業担当者がいます。
FactSales
DateKey (date of the sale)
CustomerKey (customer involved in the sale)
SalesRepKey (sales rep involved in the sale)
SalesAmount (amount of the sale)
履歴変更の追跡については...履歴変更を追跡する属性を持つディメンションは、「緩やかに変化するディメンション」としてモデル化する必要があるため、「代理キー」を使用する必要があります。したがって、たとえば、顧客ディメンションでは、顧客 ID は主キーではなく、単にビジネス キーになります...そして、任意の整数を主キーとして使用します...この任意のキーが参照されますを代理キーとして使用します。
ディメンションのデータをモデル化する方法は次のとおりです...
DimCustomer
CustomerKey (surrogate key, probably generated via IDENTITY function)
CustomerID (business key, what you will find in your source systems)
CustomerName
Location (attribute we wish to track historically)
-- the following columns are necessary to keep track of history
BeginDate
EndDate
CurrentRecord
DimSalesRep
SalesRepKey (surrogate key)
SalesRepID (business key)
SalesRepName
OfficeLocation (attribute we wish to track historically)
-- the following columns are necessary to keep track of historical changes
BeginDate
EndDate
CurrentRecord
FactSales
DateKey (this is your link to a date dimension)
CustomerKey (this is your link to DimCustomer)
SalesRepKey (this is your link to DimSalesRep)
SalesAmount
これにより、同じ顧客に対して複数のレコードを持つことができます。元。CustomerID 123 は 2012 年 3 月 5 日に NC から GA に移動します...
CustomerKey | CustomerID | CustomerName | Location | BeginDate | EndDate | CurrentRecord
1 | 123 | Ted Stevens | North Carolina | 01-01-1900 | 03-05-2012 | 0
2 | 123 | Ted Stevens | Georgia | 03-05-2012 | 01-01-2999 | 1
一部の属性の変更履歴を追跡する SalesReps やその他のディメンションにも同じことが当てはまります。
したがって、CustomerID、CustomerName (またはその他の履歴追跡されていない属性) によって販売トランザクション ファクト テーブルをスライスすると、顧客のすべてのトランザクションにわたって集計されたファクトを含む単一のレコードが表示されます。代わりに、CustomerName と Location (過去に追跡された属性) によって販売トランザクションを分析することにした場合、顧客がその場所にいた間の売上高に対応する、顧客の場所の「バージョン」ごとに個別のレコードが表示されます。
ところで、時間に余裕があり、さらに学習したい場合は、Kimball のバイブル「The Data Warehouse Toolkit」を強くお勧めします...これは、ディメンション モデリング シナリオの強固な基盤を提供するはずです。