Luan Huynh Asked: 2016-05-10 02:14:13 +0800 CST2016-05-10 02:14:13 +0800 CST 2016-05-10 02:14:13 +0800 CST 一个事实有多少个日期维度 772 关于设计星型模式:我在事实表中有三个日期列fact_table (insert_date, trade_date, close_date ...)。而且我不知道应该创建多少个日期维度? 案例 1: 暗淡 A 。这意味着:一行@fact_table 对 A 有三个 FK。 案例 2:Dim A(插入日期),Dim B(交易日期),Dim C(close_date)。这意味着:一行@fact_table 对 A 有一个 FK,对 B 有一个 FK,对 C 有一个 FK。 问题:应该创建多少个日期维度? data-warehouse 2 个回答 Voted Best Answer Yassine LD 2016-05-10T03:43:34+08:002016-05-10T03:43:34+08:00 一个维度代表一个信息类别:例如日期,产品......在您的情况下,您在事实表中有三个属性引用相同的分析轴,即“日期”,因此如果您使用星型模式,则只有一个日期维度需要,这是一个维度的角色扮演实现。 有两个维度的角色扮演实现: 表别名类型通过为每次使用分配别名,在 SQL 语句中多次使用维度。 数据库视图类型,您创建的视图数量与您需要维度上的角色数量一样多。 您只需要一个日期维度,例如:日期维度的“类型”将在上面的事实表中提到。 更新 : 建模日期和时间 维度 在所有事实和维度表中应该只有一个日期维度和一个时间维度。并非所有日期和时间字段都需要映射到日期和时间维度。仅当您需要维度中的额外属性时,才将日期时间字段映射到日期或时间维度。 通常,Date 维度的最低粒度是 Day,而 Time 维度的最低粒度是 Second。许多仓库不需要时间维度,但几乎每个数据仓库系统都使用日期维度。 通常,为日期和时间创建单独的维度。 如果有必要提取跨越日期边界的连续时间块(例如11/24/2000 10 p.m. to 11/25/2000 6 a.m.),那么如果小时和天在同一维度上会更容易。否则,单独的维度Date和Time更易于管理和查询。 如果日期和时间是单独的维度,则更容易分析周期性和重复发生的日常事件。 示例: 本周上午 9 点活跃的会议数量。如果日期和时间是分开的,这是一个简单的查询;如果将日期和时间合并为一个维度,则要复杂得多。以下是在一个日期/时间维度中同时具有日期和时间维度的问题: 问题#1: 将日期和时间组合成一个维度会创建一个非常大的维度,特别是如果您使用秒作为粒度。如果您使用 Hour 作为组合表的粒度,问题就不那么严重了。 10年数据的日期和时间维度(分开)的基数 日期维度:10 * 365 = 3650 时间维度(粒度: 秒):24 * 60 * 60 = 86400 10 年数据的日期和时间维度(组合)的基数 DateTime 维度(粒度每小时):10 * 365 * 24 = 87600 日期时间维度(粒度秒):10 * 365 * 24 * 60 * 60 = 315,360,000 DateTime 维度中的记录越多,查询性能就越慢。 问题 #2 在同一维度中同时拥有日期和时间维度可能会导致对具有一天粒度的事实表的解释问题。由于维度表中的额外粒度,很容易在同一天无意中将两条记录输入到事实表中。 查找更多:来源 Luan Huynh 2016-05-10T08:07:19+08:002016-05-10T08:07:19+08:00 我找到了答案。 这个概念被称为角色扮演维度 单个物理维度可以在事实表中被多次引用,每个引用都链接到该维度的逻辑上不同的角色。例如,事实表可以有多个日期,每个日期都由日期维度的外键表示。每个外键都必须引用日期维度的单独视图,以便引用是独立的。这些单独的维度视图(具有唯一的属性列名称)称为角色。 来自stack-overflow中的mmarie 答案。 例子
表别名类型通过为每次使用分配别名,在 SQL 语句中多次使用维度。
数据库视图类型,您创建的视图数量与您需要维度上的角色数量一样多。
您只需要一个日期维度,例如:日期维度的“类型”将在上面的事实表中提到。
建模日期和时间
维度 在所有事实和维度表中应该只有一个日期维度和一个时间维度。并非所有日期和时间字段都需要映射到日期和时间维度。仅当您需要维度中的额外属性时,才将日期时间字段映射到日期或时间维度。
通常,Date 维度的最低粒度是 Day,而 Time 维度的最低粒度是 Second。许多仓库不需要时间维度,但几乎每个数据仓库系统都使用日期维度。
通常,为日期和时间创建单独的维度。
如果有必要提取跨越日期边界的连续时间块(例如
11/24/2000 10 p.m. to 11/25/2000 6 a.m.
),那么如果小时和天在同一维度上会更容易。否则,单独的维度Date
和Time
更易于管理和查询。如果日期和时间是单独的维度,则更容易分析周期性和重复发生的日常事件。
示例: 本周上午 9 点活跃的会议数量。如果日期和时间是分开的,这是一个简单的查询;如果将日期和时间合并为一个维度,则要复杂得多。以下是在一个日期/时间维度中同时具有日期和时间维度的问题:
DateTime 维度中的记录越多,查询性能就越慢。
查找更多:来源
我找到了答案。
这个概念被称为角色扮演维度
来自stack-overflow中的mmarie 答案。
例子