桥接表(Bridge Table)是维度建模中的一类比较特殊的表。
在数据仓库的建模时,会遇到具有层次结构的维度表,对于这样的表有一种建模方式是建立父子表,即每条记录上包括一个指向其父记录的字段。这种父子表的建立在层级深度可变时尤其有用,是一个紧凑而有效的建模方式。但是这种建模方式也有缺点,就是用标准SQL很难对递归结构进行操作。有时事实表必须在最低粒度上支持带有多个值的维。如果无法改变事实表的粒度来直接支持该维,那么该多值维就必须通过一个桥接表连接到事实表。当遇到事实行的多值关系时,ETL系统既可以将每个观察值集合作为一个单独的分组,也可以在出现了相同的观察值集合时重用分组。遗憾的是,无法简单地确定出哪一种选择才是正确的。当多值维具有类型2属性时,桥接表必须是时变的。桥接表构造包含了一个加权因子,用于支持从桥接表进行加权报表生成。很多情况下,加权因子都是一种熟悉的分配因子,但是在另一些情况下,很难给出恰当的权重因子,因为指定加权因子并没有合理的基础。
与这种递归结构的父子表不同,桥接表采用不同的建模方式也可以表示这种层级结构。桥接表是建立在维度表和事实表中间的一个具有较多冗余信息的表,其中的记录包含层级结构中节点到其下面每个节点的路径。
表结构如下所示:
父关键字
子关键字
父层数
层名
底端标识
顶端标识
在桥接表中,节点与其下面的任意一个节点都建立一个关联记录保存在表中,即父子关系不再局限在相邻层,如第一层与第三层同样有父子关系,通过父层数可以区分相隔了几层。这样,可以通过父层数和父子关系来进行层级结构的查询。
场景:销售组织结构维表和销售记录事实。由于组织是有层级的,带来问题就是一条销售记录对应多个不同层的组织层级。
解决方式:ETL要先把组织层级打平到最细粒度,使事实表只只与最细粒度相关。
未解决场景:一本书的多个作者,每个作者是单独的维表。
如何解决?
把事实表拆分,标注第一第二作者。
当然,桥接表也不是一个完备的解决方案,它只能是在某些情况下是查询变得容易。