宽表和窄表
表:通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表。由于把不同的内容都放在同一张表存储,宽表已经不符合三范式的模型设计规范,随之带来的主要坏处就是数据的大量冗余,与之相对应的好处就是查询性能的提高与便捷。这种宽表的设计广泛应用于数据挖掘模型训练前的数据准备,通过把相关字段放在同一张表中,可以大大提高数据挖掘模型训练过程中迭代计算时的效率问题。
窄表:严格按照数据库设计三范式。尽量减少数据冗余,缺点是修改一个数据可能需要修改多张表。
宽表和窄表的选择?
应用场景:设计销售领域的订单事实表,维度包括:销售员、销售员所属部门、下订单的时间;度量:销售量。
订单事实表:商品销售的清单.
图一
建立模型:部门表、销售员表、订单表。符合数据库的范式设计:没有冗余字段。
对于一般的OLTP系统而言这样的表设计确实减少了冗余和,增删改查等操作也很方便。
报表场景:我们要统计每个部门各自的销售量为多少?此时写的SQL需要三个表进行关联查询。
我们完全可以根据我们的业务去设计我们的数据表;考虑到部门和销售员可以是同属于销售者这个维度,只是他们是有上下级别关系的那么依照这个思路,我们的模型可以建立为下面这样:
图二
那么统计每个部门各自的销售量,可以用两张表关联查询实现。
对于这个模型而言,有些情况下会出现冗余(填写用户,没有填写部门;填写部门没填写用户);但是对于提取数统计的逻辑相对来说要简单了好多;
综上所述:宽表就是字段比较多的表,包含的维度层次比较多,造成冗余也比较多,毁范式设计,但是利于取数统计;而窄表往往对于OLTP比较合适,符合范式设计原则。