DataTalk:是一个宽表好还是多个维表好?

0x00 前言

本篇的主题是关于数据模型的规范化和反规范化的讨论,其实也是一种常见的维度建模的设计和业务使用便捷性的冲突。

0x01 讨论

问题:

在设计数据表的时候,是一个宽表好,还是多个维度表好?

回答一:

数据仓库每张表的搭建,主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题,什么角色使用,怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题,拆解以下几点因素:

  1. 拆表情况下多张数据表的查询SQL的编写难度有多大,是否会出现为了数据提取需要关联多张表,并且需要提前知道各个表之间的关联关系。如果使用这个数据的人员较多,每个人都需要先了解所需要多张表的关联关系,然后才进行数据查询,这样是不是维度沟通成本较高,查询体验下降,影响使用者的工作效率?
  2. 多表关联查询的使用频次有多高,将重复高频的事情简化,是不是更好?
  3. 查询体验上需要考虑多表关联之后的查询性能问题,如果一张表的内容过度,是否影响查询速度?
  4. 多表关联的合理性,不同的数据维度和内容与订单表关联,是不是会存在违背常理的坑存在。比如,数据字段的对应关系是一对一,还是多对多,是否会让使用者忽略查询数据时候的过滤限制条件。
  5. 数据的安全问题,每张数据表的安全范围不同,合并成同一张表是面临的是更大的权限开放。比如订单表可能仅需要让一部分人员知晓订单信息,并不想让他们知道供应商信息。

回答二:

结合我司的一些经验来说说哈,我司会将数据用于各种各样不同主题和纬度的报表,也会将数据用于数据挖掘做模型的,因此数据分成肯定是必要的,针对报表类的数据根据报表的不同反向划分出不同的纬度表,这种方式其实就是将mysql业务库的数据经过sql语句之后重新生成一张或者多张维度表,在这之中根据经验会抽取出一个经常用的字段作为公共字段放入公共层数据中,一些经常需要用到的度量值也会抽取到度量表中,那么一些非开发人员来看数据的时候只要在页面上简单写几个sql语句就可以统计出数据来,比如月销量,周销量,日销量这些。

若是机器学习模型的同学要数据的话,我们就只需要从维度表,度量表,事实表中抽取数据做成大宽表给他们了,由于模型做的比较少,对于大宽表的经验比较少,暂时只能来一个模型数据的需求,单独写sql语句去抽取。

0x02 补充

这个问题,从本质上来讲。想讨论是数据模型设计里面的规范化和反规范化的问题。

从规范化的角度来讲,数据仓库的设计者是希望越规范越好,因为这样会减少数据的冗余,而且也便于模型的扩展。从反规范化的角度来讲,数据仓库的使用者是希望使用越方便越好,他们并不太关系规范不规范冗余不冗余,只要用着方便就好。

这种情况在工作中是十分常见的,那么该怎样来解决它?下面有两个思路:

  1. 两种方式都存。虽然,这样看起来会占用更多的存储空间,但不失为一种合适的解决方案,因为宽表是通过别的表拼接而成的,因此宽表的存储周期是可以短一些。
  2. 只存多个维度表,通过视图来创建宽表。这种方式适合于宽表的查询次数较少的情况。比如在Hive中,宽表其实只是为了计算出来之后导入Es等系统中供其它系统查询,那么久没必要存储一份宽表,直接通过视图来封装就可以。

另外,数据仓库的设计,往往不能是以计算出几张表就结束了,我们更应该提供的是数据服务,让使用方都通过服务的方式来访问我们的数据,而不是简单地将表暴露出去。当我们以数据服务的方式提供数据的时候,不管是易用性还是安全性都更容易得到满足。

0xFF 总结

感谢 Joker 和 Alan 的回答,感谢 Rebie 的整理,感谢木东居士的总结(自己感谢自己,^_^)。

DataTalk 系列的文章结构一般分为三部分:

  • 第一部分是居士的一个小的前言,大致明确该篇的主题
  • 第二部分是问题讨论的主体部分,居士会对大家讨论的内容进行总结和梳理,尽量保证原汁原味。
  • 第三部分是居士的总结,主观性比较强,算是自己的理解。

一般来讲,每一篇文章都会对应到 GitHub 中的一个 Issue,比如本篇讨论内容的地址为:https://github.com/dantezhao/data-group/issues/1

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习养成记

数据分析小案例(三):调查问卷(python)

案件回顾 传统吉祥物还是萌系美少女 商业街想设计一个吉祥物做宣传 对商业街店主和顾客发放调查问卷 调查问卷的问题中有对吉祥物的偏好调查。也有对商业街的魅力调...

5117
来自专栏人人都是极客

浅谈网络语音技术

当我们使用像Skype、QQ这样的工具和朋友流畅地进行语音视频聊天时,我们可曾想过其背后有哪些强大的技术在支撑?本文将对网络语音通话所使用到的技术做一些简单的介...

1672
来自专栏文渊之博

数据仓库基础介绍

本文将会讲述 BI/DW/DA 领域的一些常见概念,如:事实表、维度表、建模、多维分析、cube 等,但不涉及具体实例分析。

1534
来自专栏机器学习和数学

Newton迭代法

今天和大家分享一下,之前抽空写的一篇论文,主要内容就是Newton迭代法,属于数学里面比较基础的,原理也不难,主要通过Newton迭代法可以体会到迭代的思想,以...

1396
来自专栏腾讯移动品质中心TMQ的专栏

编写BUG报告有诀窍?Toulmin模型来帮忙

前不久,桓哥的分享PPT中提到了Toulmin论证模型,并在其中提到了这么一句话“尝试建议:用Toulmin模型指导编写BUG报告(特别是容易被忽略限定部分,即...

3458
来自专栏ATYUN订阅号

亚马逊改进平台SageMaker,更新内置算法和Git集成

亚马逊一直在为其云计算子公司AWS添加AI功能。今天,亚马逊宣布了一系列对SageMaker的改进,SageMaker是用于构建,训练和部署机器学习模型的端到端...

1432
来自专栏大数据文摘

[译] 天龙八步 第二弹:8步从Python白丁到专家,从基础到深度学习

2807
来自专栏CDA数据分析师

机器学习和 AI 领域必须了解的工具

? 关于数据科学,工具可能并不是那么热门的话题。人们似乎更关注最新的聊天机器人技术以及深度学习框架。 但这显然是不合理的。为什么不花些时间,挑选合适的...

19210
来自专栏ThoughtWorks

Lightweight Architecture Decision Records | 雷达哔哔哔

ThoughtWorks每年都会出品两期技术雷达,这是一份关于科技行业的技术趋势报告,在四个象限:技术、平台、工具以及语言和框架对每一个条目(Blip)做采用、...

1362
来自专栏机器之心

深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置)

机器之心整理 参与:李泽南、李亚洲 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:TensorFlow + Docker + PyCha...

2945

扫码关注云+社区

领取腾讯云代金券