数据仓库三种事实表(fact_table) --工作备忘2016/02/14

数据 仓库领域有一个概念叫Transaction fact table,中文一般翻译为“事务事实表”。事务事实表是维度建模的 数据仓库 中三种基本 类型 事实表中的一种,另外两种分别是周期快照事实表和累积快照事实表。 

       事务事实表与周期快照事实表、累积快照事实表使用相同的一致性维度,但是它们在描述业务事实方面是有着非常大的差异的。 

       事务事实表记录的事务层面的事实,保存的是最原子的数据,也称“原子事实表”。事务事实表中的数据在事务事件发生后产生,数据的粒度通常是每个事务一条记录。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。 

       事务事实表的日期维度记录的是事务发生的日期,它记录的事实是事务 活动 的内容。 用户 可以通过事务事实表对事务行为进行特别详细的分析。 

       通过事务事实表,还可以建立聚集事实表,为用户提供高 性能 的分析。

      2) 在数据仓库领域有一个概念叫Periodic snapshot fact table,中文一般翻译为“周期快照事实表”。
       周期快照事实表以具有规律性的、可预见的 时间 间隔来记录事实,时间间隔如每天、每月、每年等等。典型的例子如销售日快照表、库存日快照表等。

       周期快照事实表的粒度是每个时间段一条记录,通常比事务事实表的粒度要粗,是在事务事实表之上建立的聚集表。周期快照事实表的维度个数比事务事实表要少,但是记录的事实要比事务事实表多。

       周期快照事实表的日期维度通常是记录时间段的终止日,记录的事实是这个时间段内一些聚集事实值。事实表的数据一旦插入即不能更改,其更新方式为增量更新。

      3)在数据仓库领域有一个概念叫Accumulating snapshot fact table,中文一般翻译为“累积快照事实表”。
       累积快照事实表和周期快照事实表有些相似之处,它们存储的都是事务数据的快照信息。但是它们之间也有着很大的不同,周期快照事实表记录的确定的周期的数据,而累积快照事实表记录的不确定的周期的数据。 

        累积快照事实表代表的是完全覆盖一个事务或产品的生命周期的时间跨度,它通常具有多个日期字段,用来记录整个生命周期中的关键时间点。另外,它还会有一个用于指示最后更新日期的附加日期字段。由于事实表中许多日期在首次加载时是不知道的,所以必须使用代理关键字来处理未定义的日期,而且这类事实表在数据加载完后,是可以对它进行更新的,来补充随后知道的日期信息。

----实际应用

1. ad事实表是累计事实表,一条数据对应一个primary key的数据,之后所有更改,都在这条数据上进行更新,数据粒度是最粗的
2. tt 是事实表是事务事实表, 一条记录对应一个事务,所以会对应多个primary key, 任何有关这个主key的事务都会被插入,之后不再更新
3. at 是基于上面两种表中间的一种事务表,即对应多个priamry key的detail 事务,而且事务在短期内的变化,也会更新在一条记录上
另外
skp 是维度表的代理主键,每个维度表都会有,事实表靠skp与维度表关联
skf 是事实表的代理主键,以咱公司的表来看,并非所有事实表都配置skf主键,
skp和skf两个根据业务需求来看,没有必要的对应关系,可以1对1,也可以1对多(1个skp对应多条skf)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完善后的代码如下: ``` #define MAX_LINE 10 // 显示缓存最大行数 #define LINE_LEN 80 // 每行最大字符数 #define MAX_Back_LINE 20 // 备份缓存最大行数 #define LINE_Back_LEN 80 // 每行最大字符数 char display_buf[MAX_LINE][LINE_LEN + 1] = {0}; // 显示缓存 char BackStor_buf[MAX_Back_LINE][LINE_Back_LEN + 1]; // 备份缓存 uint8_t current_line = 0; // 当前行数 uint8_t current_pos = 0; // 当前字符数 uint8_t fact_line = 0; // 当前真实行数,即已经添加到缓存中的行数 uint8_t Page_logo = 0; // 当前页面 uint8_t Page_line = 0; // 备份行数 uint8_t MAX_Page = 0; // 最大页数 // 向显示缓存中添加一行文本 void add_display_line(char* text) { // 将新行添加到缓存末尾 strcpy(BackStor_buf[fact_line], text); strcpy(display_buf[current_line], text); // 如果缓存已满,则将所有行上移一行 if (current_line == MAX_LINE) { for (int i = 1; i < MAX_LINE; i++) { strcpy(display_buf[i - 1], display_buf[i]); } current_line--; Page_line--; // 如果当前页已满,则翻页,并更新最大页数 if (Page_line == 0) { Page_logo++; MAX_Page = fact_line / current_line; if (Page_logo > MAX_Page) { Page_logo = MAX_Page; } } } current_line++; fact_line++; Page_line++; } ``` 在修改后的代码中,我们增加了一些宏定义,定义了缓存的最大行数和字符数,以及备份缓存的最大行数和字符数。同时,我们还添加了一个最大页数的变量 `MAX_Page`。在 `add_display_line` 函数中,我们首先将新行添加到缓存末尾,然后再判断当前缓存是否已满,如果已满,则将所有行上移一行。在上移行的过程中,需要将当前行和页码减一。如果当前页已满,则翻页,并更新最大页数。最后,我们将当前行、实际行和页码均加一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值