0

我想为分析项目设计星型模式。该分析围绕“客户”维度展开。

我很难为表格建模。这是我想出的两张表:

急诊室

我会一一询问我的担忧:

  1. 如何创建日期维度以便事实(invoice_date)和客户(date_of_joining)通用?我的意思是,最终用户可以选择一个日期,以便他可以看到有多少用户在该特定日期加入以及总销售额?
  2. 这是一个好的设计吗?我的意思是“位置”、“收银员”和“类别”可以称为维度,但我将它们的“名称”而不是它们的“id”刷新到事实表中。它仅用于显示目的。所以,我的维度表数量较少。

我对 BI 完全陌生。所以,一个说明性的答案会很有帮助。谢谢!

4

3 回答 3

1

您问了多个问题,所以我将答案分开:

  1. 您可以拥有一个具有单日粒度的单独日历日期维度。根据所需的报告类型,您可以拥有与周、月、年、季度等相对应的详细信息。因此您可以拥有类似的字段Date, Week_Start_Date, Week_End_Date, Month_Start_Date, Month_End_Date等等。生成日历日期维度的最佳方法是使用电子表格并手动构建。对于某些字段,例如 Week_Start_Date、Week_End_Date、Month_Start_Date、Month_End_date,您可以使用 SQL。许多人在事实表中有一些无效的日期。事实表中引用特殊数据条件的外键引用必须指向日历日期表中的“非日期”日期。您至少需要日历日期表中的这些特殊记录之一,但您可能希望区分其中几种异常情况。对于不适用的日期情况,日期类型的值为不适用或NA。事实表中的外键永远不能为空,因为这违反了参照完整性。

  2. 您可以将日期维度的引用添加到 Customer Dimension 和 Fact 表,但如果您需要查看是否真的需要这个,因为您可以加入所有三个表(Fact-> Date_dim on Date_keyFact-> Cust_dim on Customer_id& 获取您正在寻找的详细信息。)

  3. 您应该为事实表和维度表分配正确的名称,例如 Customer_Fact、Customer_Dim。理想情况下,每个维度(即位置)应该有一个单独的维度表,在事实表中具有外键引用。这将帮助您跟踪维度表中的更改以及您可能不需要加载整个事实的维度中的任何更改。

于 2018-02-05T12:47:29.837 回答
1
  1. 这是我会做的方式,所以它必须是一个好的设计。我会称之为dimCalendar,但那是次要的东西。

  2. 这样做的方法是创建和填充表,然后添加外键引用。

于 2018-01-18T17:17:13.963 回答
0

该分析围绕“客户”维度展开

不,分析应该围绕您的事实表解决

“事实”是事实表的一个坏名字

您要分析的过程或事件是什么?那是你的事实表

您的日期维度应如下所示:

create table dim.date (
  date_key int primary key,
  name text not null unique,
  date_iso date unique,
  year smallint,
  quarter smallint,
  month smallint,
  month_name text
  ...
);

insert into dim.date values 
(0, 'N/A', null, null, null, null, null),
(20180101, 'Jan 1, 2018', '2018-01-21', 2018, 1, 1, 'January');

一般来说,您应该避免在数据库中使用智能键,但 dim.date 是一个例外。对主键使用 int 类型,但使其值表示日期(例如 20180101 代表 '2018-01-01')。这使得将来按日期对事实表进行分区变得更加容易

此外,您不需要数据仓库中的外键。您的 ETL 工具将处理参照完整性。

您应该从一个包含分析所需的所有列的大事实表开始。如果需要节省磁盘空间,则将一些数据拆分为维度

您应该阅读敏捷数据仓库设计

于 2018-01-23T00:27:37.187 回答