阿里巴巴大数据之路读书笔记——事实表设计的八大原则
事实表设计的八大原则
原则一 :尽可能包含所有与业务过程相关的事实
事实表设计的目的是为了度量业务过程,所以分析哪些事实与业务过程有关是设计中非常重要的关注点。在事实表 中应该尽量包含所有与业务过程相关的事实
,即使存在冗余,但是因为事实通常为数字型,带来的存储开销也不会很大。
原则二 :只选择与业务过程相关的事实
在选择事实时,应该注意只选择与业务过程
有关的事实。比如在订单的下单这个业务过程的事实表设计中 ,不应该存在支付金额这个表示支付业务过程的事实。
原则三 分解不可加性事实为可加的组件
对于不具备可加性条件的事实,需要分解为可加的组件。比如订单的优惠率,应该分解为订单原价金额与订单优惠金额两个事实
存储在事实表中。
原则四 :在选择维度和事实之前必须先声明粒度
粒度的声明是事实表设计中不可忽视的重要一步,粒度用于确定实表中一行所表示业务的细节层次,决定了维度模型的扩展性,在选择维度和事实之前必须先声明粒度,且每个维度和事实必须与所定义的粒度保持一致。在设计事实表的过程中,粒度定义得越细越好,建议从最低级别的原子粒度开始,因为原子粒度提供了最大限度的灵活性,可以支持无法预期的各种细节层次的用户需求。在事实表中,通常通过业务描述来表述粒度,但对于聚集性事实表的粒度描述,可采用维度或维度
属性组合的方式。
原则五: 在同一个事实表中不能有多种不同粒度的事实
事实表中的所有事实需要与表定义的粒度保持一致,在同 个事表中不能有多种不同粒度的事实。如表 1.1 所示为机票支付成功事务事实表,粒度为票一级的,而在实际业务中,一个订单可以同时支付多张票,如 ID 100901 的订单包含三张机票, ID 100902 的订单包含两张机票, ID 100903 的订单包含一张机票。在该事实表的设计中,票支付金额和票折扣金额两个事实与表定义的粒度一致,并且支持按表的任意维度汇总,可以添加进该事实表中。而订单支付金额和订单票数作为上 层粒度的订单级事实,与该票级事实表的粒度不一致,且不能进行汇总。比如订单 ID100901 的订单支付金额为 3700 元,订单票数为 张,如果这两个度量在该表进行汇总计算总订单金额和总票数,则会造成重复计算的问题所以不能作为该表的度量选人。
原则六 :事实的单位要保持一致
对于同个事实表中事实的单位
,应该保持一致。比如原订单金额、订单优惠金额、订单运费金额这三个事实,应该采用一致的计量单位,为元或分,以方便使用。
原则七 : 对事实的 null 值要处理
对于事实表中事实度量为 null 值的处理,因为在数据库中 null对常用数字型字段的 SQL 过滤条件都不生效,比如大于、小于、等于、大于或等于、小于或等于,建议用零值
填充。
原则八 :使用退化维度提高事实表的易用性
Kimbal 维度建模中,通常按照星形模型的方式来设计,对于维度的获取采用的是通过事实表的外键关联专门的维表的方式,谨慎使用退化维度。而在大数据领域的事实表设计中,则大量采用退化维度的方式,在事实表中存储各种类型的常用维度信息。这样设计的目的主要是为了减少下游用户使用时关联多个表的操作,直接通过退化维度实现对事实表的过滤查询、控制聚合层次、排序数据以及定义主从关系等。通过增加冗余存储的方式减少计算开销,提高使用效率
。
相关文章
- odoo关于计算字段store=True时导致的安装/更新时间较长问题的解决方案
- 分享Python7个爬虫小案例(附源码)
- 计算机介绍和五大组成
- MP 代码生成器工具类
- 【建议收藏】超详细的Canal入门,看这篇就够了!!!
- 排查系统执行SQL与数据库直接执行结果不一致的问题
- 网络通信——TCP “三次握手“、“四次挥手“ 详解
- JDBC 连接 MySQL
- 序列类型
- 面试官:从 MySQL 读取 100w 数据进行处理,应该怎么做?问倒一大遍!
- 理论+实战,详解Sharding Sphere-jdbc
- 宕机了,Redis 如何避免数据丢失?
- 通过手动创建hibernate工厂,自动生成表,完成数据库备份还原功能
- es6新增哪些特性
- 前端面试题八股文汇总(最新)
- 关于shape和axis的使用
- Vue3动态路由(Vite+Vue3+TS+Mock)
- 11 款顶级 MySQL 图形化工具汇总,总有一款适合你!(建议收藏)
- redis实现用户查询次数限制
- controller层,service层,mapper层,entity层的作用与联系。