其维表、事实表的关系图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/44100f629e9c68e16b5ef8239ed03b9a.png)
一个维表会对应多个事实表,而维表和事实表所有关联起来就形成一个宽表,其关系如同mysql中的外键索引,如A表中有B_id,A作为维表,B作为事实表,A(维表)可通过B_id来关联B(事实表),然后关联汇总生成的SQL就是宽表。
BI系统中可根据事实表和维度表的关系,应遵循如下两种模型的规范:星型模型和雪花型模型。
-
星型表:反范式,数据冗余,查询效率高。
-
遵循范式:数据不冗余,但引用层级深,维护复杂,查询效率较低。
下面举一个星型模型(体验课上课预约记录)的例子来说明如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2c552ebca3b7ee66bfe1c61febc585e8.png)
上图以user_table_course_schedule的部分字段(user_id、table_course_schedule_id、teacher_id、gmt_create)来作为维度,并分别关联到了userinfo、tablec_course_schedule、teacherinfo这三张事实表,然后形成一张宽表。
以上面星型模型的例子,对其进行修改,举一个雪花模型例子来说明如下:
![](https://i-blog.csdnimg.cn/blog_migrate/df8060e275d7064107e316cc5653f84f.png)
上面雪花模型中,学生信息事实表的orderId还继续关联了下一个层级体验课记录表,体验课报名记录表还可能会继续往下关联,对于复杂的系统而言,一般会采用雪花模型,关键层级会较多,而星型模型的关联过于单一,层级不够深,无法支持这种操作。
理解了上面两种模型的设计,接下来需要确定维度和指标的用法:
维度与指标的规范:
-
维度:维度用于关联事实表,也可用于做冗余显示(如gmt_create),用于数据检索,所以对于维度设计时,可将其进行分类(看业务扩展需要):
-
时间维:将时间进行维度细分,如gmt_create划分为年维度、月维度、日维度。
-
地域维:将地域划分为省维度、市维度、区维度。反例:把省市区 只作为一个维度,而没有拆分,后面进行筛选就不方便。
-
其他维度按业务进行扩招
-
-
指标:用于统计(如总和、平均数、最大值、最小值)、排序等。