事实表和维度表都是在数据库建模过程中必须要考虑的两种记录业务数据的规范。
事实表在很多业务中也叫流水表,用来记录业务系统发生的事实行为数据的;比如一个网络监控系统要对人的上网行为进行记录,你每访问的每一个网站、鼠标的每一个点击动作都会产生一条事实数据,这个数据包含你当前上网设备的IP、上网设备的地理位置、网络运营商、访问的网站、网站性质、网站的运营者、网站访问时间、网站的响应时间,这八个字段完整反映了这个上网业务的事实,当我们把数据存到数据库的时候,存储该数据的表就是事实表,也叫流水表。
但随着大量数据的持续性的写入,这个表的存储空间将会变得越来越大,查询也会变的越来越慢,而且如果中途某个网站的属性发生了变更,需要对历史的全量数据进行UPDATE,效率会很低;这种情况就要想办法解决查询慢和更新效率低的问题,于是就想到将事实表进行拆解。
从写入表中字段的数据来看总会有大面积的重复,比如跟上网设备IP相关联的上网设备的地理位置、网络运营商这三个字段属于IP信息的范畴,而运营网站、网站性质、网站的运营者这三个字段又属于网站属性的范畴,而这个IP信息和网站属性这两类数据是不会频繁变化的;既然这两类信息不会频繁变化,可以把原来这张大的事实表将其中的跟IP相关的信息给提取出来成为IP信息表,而把网站相关的信息也给提取出来成为网站信息表;这样就将原本一张大的事实表给拆分成了三张数据规模相对更小的小表,原本那个有八个字段的事实表就变成了只有四个字段的事实表,而多出来的这两张IP信息表和网站信息表就是我们所说的维度表。
事实表就是直接反映业务行为事实的表,它的数据是实时产生和动态变化的;而维度表则可以理解是用来辅助对事实表中的数据加以说明、补充的,是对事实表数据的一种延伸,特点就是数据量相对较小且相对静态,不易发生变化。