Fact表的首选列数是多少?

时间:2017-05-02 08:48:21

标签: data-warehouse fact-table

我的事实表中包含政策数据&我想将Policy Products详细信息添加到仓库。 一项政策获得不同类型的产品,价值也是动态的。

例如:Policy01可能有两个产品Building&保额值为1000&的内容。分别为500。而Policy02只能获得750的建设。

有30种产品可供使用,我需要存储保险金额,毛额和金额。每项政策的每种产品的净保费。 因此,如果我将每个产品类型的单独列添加到事实表中,它将添加120个实时列(目前有23列)。每个政策最多还有5个产品,因此只有20列包含值&其他人仍然是空的。

事实表有100多列可以吗?可以连续保留这么多空值吗? 还是有其他方法可以解决这个问题吗?

我是DWH的新手,希望有人能告诉我如何将这些添加到我的事实表中。

2 个答案:

答案 0 :(得分:2)

一种方法是添加产品维度: enter image description here

然后您可以按政策返回总计:

SELECT
    PolicyKey
    SUM(PolicyProductValue) AS PolicyValue
FROM
    Fact.PolicyProductValue
GROUP BY
    PolicyKey
;

或产品:

SELECT
    ProductKey,
    SUM(PolicyProductValue) AS ProductValue
FROM
    Fact.PolicyProductValue
GROUP BY
    ProductKey
;

或两者:

SELECT
    PolicyKey,
    ProductKey,
    SUM(PolicyProductValue) AS PolicyProductValue
FROM
    Fact.PolicyProductValue
GROUP BY
    PolicyKey,
    ProductKey
;

此方法将产品从列移动到行。

这项技术有几个好处:

  1. 添加新行比列更容易。
  2. 您可以向Dim.Product添加常用过滤器。
  3. Dim.Product提供了创建产品层次结构的位置。例如:
  4. | Product Key | Product Name | Product Group | | ----------- | ------------ | --------------------| | 0 | Building | Building & Contents | | 1 | Contents | Building & Contents |

答案 1 :(得分:2)

在事实表中有100多列是不行的;这是一个不正确的数据模型的症状(缺失值也是如此 - 设计良好的事实表不应该有任何)。

事实表设计的逻辑如下: 首先,在表格上确定“粒度” - 它将包含的最原子级数据。在您的情况下,数据粒度由策略编号+产品定义。他们一起唯一地识别您可获得的最详细信息。

然后,确定您的“事实”。通常,事实是您可以聚合的数据(总和,计数,平均等)。在您的情况下,它们是Insured_Value,Gross_Premium,Net_Premium。

最后,为这些事实(维度)定义业务背景。在您的情况下,它们是政策和产品(很可能,您也会有某种日期)。

您生成的事实表应如下所示:

  • Policy_Date
  • Policy_Number
  • Product_ID
  • Insured_Value
  • Gross_Premium
  • Net_Premium

Policy_Date将提供与“日历”维度的连接,Product_ID将连接到“产品”维度(包含您的30个产品及其描述的表格)。

Policy_Number是所谓的“退化维度” - 它是一个通常没有连接到任何维度的ID(但如果需要,可以)。它作为参考存储在事实表中。有些人为模型添加了“策略”维度,但通常这是一个设计错误 - 这样的维度太“高”,在大小上与事实表相当,这可能会大大降低模型性能。通常最好将策略属性拆分为多个小维度,并将策略编号保留为简并维度。

因此,具有5个产品的典型策略将在事实表中表示为5条记录,而不是包含5个字段的一条记录。这是至关重要的区别 - 永远不会在事实表字段的名称中存储信息(在您的情况下为产品)。