多对多维度或多值维度

维度表和事实表之间的标准关系是一对多关系,这意味着维度表中的一行记录会连接事实表中的多行记录,但是事实表中的一行记录在维度表中只关联一行记录。这种关系很重要,因为它防止了重复计数。幸运的是,在大多数情况下都是这种一对多关系。
在现实世界中还存在比一对多关系更复杂的两种常见情况:
事实表和维度表之间的多对多关系。
维度表之间的多对多关系。
这两种情况本质是相同的,但事实表和维度表之间的多对多关系少了唯一描述事实和维度组的中间维度。
对于这两种情况,我们介绍一种称为桥接表的中间表,以支持更复杂的多对多关系。

1. 事实表和维度表之间的多对多关系

在多个维度表的值可以赋给单个事实事务时,事实表和维度表之间通常是多对多关系。一个常见的示例是多个销售代表可以参与给定的销售事务,这种情形经常发生在涉及大宗交易的复杂销售事件中(例如计算机系统)。精确地处理这种情况需要创建一个桥接表,将销售代表组合成一个组。SalesRepGroup桥接表如图2-4所示。

ETL过程需要针对每条引入的事实表记录中的销售代表组合,在桥接表中查找相应的销售代表组键。如果该销售代表组键不存在,就添加一个新的销售代表组。注意图2-4所示的桥接表有重复计数的风险。如果按照销售代表累加销售量,那么每个销售代表都会对总销售量做出贡献。对某些分析而言结果是正确的,但对于其他情况仍会有重复计数的问题。要解决这个问题,可以向桥接表中添加加权因子列。加权因子是一个分数值,所有的销售代表组的加权因子累加起来为1。将加权因子和累加事实相乘,以按照每个销售代表在分组中的比重分配事实。
注意可能需要在Orders和SalesRepGroup之间添加一个SalesRepGroupKey表,以支持真正的主键-外键关系。这会把这个事实-维度实例变成维度-维度实例。

2.维度之间的多对多关系

从分析的角度来看,维度之间的多对多关系是一个很重要的概念,大多数维度都不是完全相互独立的。维度之间的独立性是连续的,而不是有或没有这两种截然不同的状态。例如在连续的一端,零售店这条链状关系的库存维度和产品维度是相对独立的,而不是绝对独立的。一些库存方式不适合某些产品。其他维度之间的关系则紧密得多,但是由于存在多对多关系,因此很难将其组合成单个维度。例如在银行系统中,账户和顾客之间有直接关系,但不是一对一的关系。一个账户可以有一个或多个签名确认的顾客,一个顾客也可有多个账户。银行通常从账户的角度来处理数据;MonthAccountSnapshot(月账快照)是金融机构中常见的一种事实表。因为账户和顾客之间存在的多对多关系,这种更多关注账户的系统就很难按照顾客来查看账户。一种方法是创建CustomerGroup桥接表来连接事实表,例如前面多对多示例中的SalesRepGroup表。较好的方法是利用账户和顾客之间的关系,如图2-5所示。

账户和顾客维度之间的AccountToCustomer桥接表可以捕获多对多关系,并且有几个显著的优点。首先,源系统中的关系是已知的,因此创建桥接表比手动构建SalesRepGroup维度表更容易。其次,账户-顾客关系自身就非常有趣。AccountToCustomer桥接表可以回答诸如”每个顾客的平均账户数量是多少?”这样的问题,而无须连接任何事实表。
桥接表经常是底层业务过程的标志,特别是在需要跟踪桥接表随时间而产生的变化(即关系本身是类型2变化)时。对顾客和账户来说,业务过程可能称为账户维护,其中一项事务可能称作”添加签名人”。如果3个顾客与同一个账户关联,在源系统中该账户就会有3个”Add(添加)”事务。通常这些事务和它们表示的业务过程还不是很重要,不需要在DW/BI系统中通过它们自身的事实表来跟踪。然而,这些关系和它们产生的变化对分析业务来说是相当重要的。我们在维度模型中把它们包含为渐变维度,在一些情况下包含为桥接表。

多对多维度或多值维度-桥接表相关推荐

  1. ssas 分层维度_通过SSAS维度层次结构增强数据分析

    ssas 分层维度 介绍 (Introduction) This article will discuss how SSAS Dimension Hierarchies can be used to ...

  2. pytorch: 给tensor删除或者添加维度为1的维度(squeeze和unsqueeze)

    删除tensor中维度为1的维度 在pytorch中,用torch.squeeze()函数或者tensor的自身成员函数squeeze()去除维度为1的维度. import torch x = tor ...

  3. 数据仓库 桥接表_数据仓库经验总结

    1.使用代理键而不是自然键作为主键 因为业务系统产生的自然键容易变化重复,而专门生成的整数的代理键可以屏蔽业务系统的不规范 2.使用一致性维度,企业总线架构,而不是数据集市烟囱式架构 3.注重多个系统 ...

  4. python mysql 的默认值_python--MySQL 库,表的详细操作

    一 库操作 数据库命名规则 可以由数字,字母,下划线,@, #, $ 区分大小写 唯一性 不能使用关键字如 create  select 不能单独使用数字 最长128位 # 这些是对上次的补充. 二 ...

  5. 如何解决Office2016安装时提示:错误1406。安装程序无法将值写入注册表项\.xlsx

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 一.当前问题 二.解决办法 一.当前问题 Office2016安装时提示:错误1406.安装程序无法将值写入注册表 ...

  6. 哈希值 哈希表_哈希杰森

    哈希值 哈希表 我最近写了一个简单的库,可预测地对json进行哈希处理 . 该实用程序基于出色的Jackson Json解析库构建 问题 我需要从相当大的基于json的内容生成的哈希值,以便稍后确定该 ...

  7. oracle中获取列的值,oracle - Oracle-SQL从具有特定列和值的所有表中获取数据 - SO中文参考 - www.soinside.com...

    假设我们有一个表ACCOUNT,其中的CUST_ID列如下:SQL> SELECT OWNER, A.TABLE_NAME, COLUMN_NAME FROM 2 ALL_TAB_COLS A ...

  8. 查看数据库中的字段所在的表中或某值所在的表和字段

    ***********************************字段在哪个表中 select tab.name table_name, col.name column_name from sys ...

  9. VMware 无法将值写入注册表项

    问题:VMware 无法将值写入注册表项......请与技术人员联系 解决:将360或其他的安全防护软件关闭,再重试.

最新文章

  1. !! 机器学习常用工具
  2. 用Java实现输入一个英语文本输出第1000个字节后的第一个完整单词
  3. 网站优化中需要关注哪些对网站排名有关的内容呢?
  4. SD-WAN是更简单的企业WAN解决方案吗?
  5. oracle sql语句
  6. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】
  7. flac3d命令流实例大全_Activiti6.0工作流引擎深度解析
  8. linux 如何安装Python3.5
  9. 书呆子rico_来自书呆子总书呆子的6条阅读建议
  10. [设计纹理素材]可爱手绘淡雅清新图案花样背景素材
  11. java 聊天室界面_java图形界面聊天室简版
  12. MySql的用户管理权限
  13. mysql5.4升级5.6_Laravel5.4 升级到 5.6
  14. codejock Toolkit Pro for Visual C++ MFC 零售版
  15. mediator模式-调停者模式
  16. 中投、汇金、四大国有资产管理公司、华融、长城、东方、信达
  17. 基于TILE-GX实现快速数据包处理框架-netlib实现分析
  18. 新旧音标对照表与英式音标表
  19. 小型计算机和Pc,超小型台式电脑:重量相当于两个新iPhone
  20. 图的点连通度边连通度总结

热门文章

  1. 飞檐走壁已经不是成龙甄子丹们的特技了,TA也可以做到!
  2. linux时间同步命令centos6,CentOS6.5搭建NTP服务器,并为思科交换机提供时间同步
  3. 国家著作权: DNA 计算公式, 肽展定理公式与 变嘧啶 推导.
  4. centos配置网桥以及brctl命令的使用
  5. c语言编活期储蓄银行系统,C语言编程1活期存款。活期利息每一季度结算...
  6. B站愚人节彩蛋,UP主 “集体变绿”
  7. 这个设计思想能启蒙你很多年,嵌入式裸机按键扫描
  8. 2017年4月24号课堂笔记
  9. linux环境变量占位符,linuxea:go fmt简单用法和占位符使用(6)
  10. 落地,请开手机李小晚【转】