您能帮忙了解如何使用尺寸的Surrogate键填充事实表。
我有以下事实表和尺寸:
ClaimFacts
ContractDim_SK ClaimDim_SK AccountingDim_SK ClaimNbr ClaimAmount
ContractDim
ContractDim_SK(PK)ContractNbr(BK)ReportingPeriod(BK)代码名称
AccountingDim
TransactionNbr(BK)ReportingPeriod(PK)TransactionCode CurrencyCode(我应该在这里添加ContractNbr吗?OLTP中的原始表有它)
ClaimDim
CalimsDim_Sk(PK)CalimNbr(BK)ReportingPeriod(BK)ClaimDesc ClaimName(我应该在这里添加ContractNbr吗?? OLTP中的原始表有它)
我将数据加载到事实表中的逻辑如下:
这样做的正确方法是什么?请帮忙,谢谢
它通常的工作方式:
基本示例(使用T-SQL)。假设您有以下2个表格:
Table OLTP.Sales
( Contract_BK,
Amount,
Quanity)
Table Dim.Contract
( Contract_SK,
Contract_BK,
Contract Type)
要交换密钥:
SELECT
c.Contract_SK
,s.Amount
,s.Quantity
INTO
Fact.Sales
FROM
OLTP.Sales s LEFT JOIN Dim.Contract c ON s.Contract_BK = c.Contract_BK
-- Test for missing keys
SELECT
*
FROM
Fact.Sale
WHERE
Contract_SK IS NULL
另外,我相信你的设计有些错误。
如果您需要更多相关信息,我推荐这本书:
Star Schema The Complete Reference
[编辑以回答后续问题]:
我并不是要从Claim维度中删除ClaimNbr字段。我建议你根本不需要这样的尺寸。
这可能有点难以消化,但请考虑以下内容。 “索赔”本质上是信息的容器(与“发票”,“订单”等相同)。如果将所有有用的数据移动到相关的维度,那么除了空容器之外什么都不应该留下。
例如,假设您的OLTP声明表包含以下字段:声明编号,报告期间,声明说明,声明名称,合同编号,声明金额。您可以按如下方式对它们建模:
这留下3个字段:索赔号,索赔名称和索赔说明。在这一点上,一些设计师创建维度“索赔”并将这些字段停放在那里。正如我之前提到的,这是一个错误,因为您的维度中的记录将与事实表中的记录一样多,从而导致严重的问题。
更好的设计是将这些字段留在事实表中。声明号码变为“退化维度” - “空”(不存在)维度的业务键。从本质上讲,它只是信息容器的ID,如发票号,订单号等。
声明名称和声明说明也应保留在事实表中,并成为“非数字”(非加性)事实。如果你需要在报告中显示它们,它很容易做到,你可以计算它们,对它们进行条件逻辑,测量它们的长度等。
查看此内容的另一种方式:维度通常用于通过某些属性/字段“切片”(disect)事实。例如,“按国家/地区的销售额”,“按工厂位置的产品成本”等。但您无法按描述,注释或其他自由文本进行切片 - 这没有任何意义。
如果您的描述或其他声明属性是结构化怎么办?例如,如果它们用于对您的声明进行分类/分类?在这种情况下,它们不是自由文本,它们是属于维度的属性。例如,您可以设计维度“声明类型”。或“索赔状态”。等等。如果这些小属性文件中有太多,你可以将它们组合成所谓的“垃圾”维度(又名“简档”维度),即维度“索赔简档”。这种设计干净而有效。