昨天面对某客户域做表关联的时候发现了。

有两张相同内容的主表。但是表的设计结构并不相同:

(每个领域都有主表,每次往这个领域(库)添加新表的时候一般都会join 主表,从而有唯一的主键id)

这两个表提供了这个领域的主键(id).

在这个

+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id      | int | |
| name   | string | |
| phone   | string | |
| gender   | string | |
| cardno  | string | |
| age    | string | |
| school   | string | |
| quora    | int | |

..

...

..

目测有60个字段这是一张宽表.
+------------+------------+----------+--+

+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id      | int | |
| value1  | string | |
| type1  | string | |
| value2  | string | |
| type2  | string | |
| age    | string | |
| school   | string | |
| quora    | int | |

目测有不到10个字段
+------------+------------+----------+--+

这是一张窄表

select type1,type2 from thistable group by type1,typ2;

发现类型数据有14种类左右

这样就相当于把第一个宽表的数据(可能剔除了不重要的字段)然后完全放开,行数暴增。

==============================================================================

我讲一下怎么用设计性能原理还要留给大家去分析:

每次都要从其他表抽取数据关联这个表id(唯一主键),比如这个第三方表名字叫第三方客户信息 没有id这列(毕竟id列是我们在自己的系统自己生成的),

只有用户名和手机号+(第三方提供的字段(比如一周洗几次澡)),我们用name+ phone去作为join on的条件关联主表窄表,得到新的有主键的表。

select id ,max(a.字段) from 第三方表 a

join

(select id,value1 as phone,value2 as name from 主表窄表 where type1=‘MOBILE_PHONE’  and type2='NAME' group by id,value1,value2) b

on a.phone=b.phone and a.name=b.name

group by id.

note:上面的group by 的作用主要是为了去重。

但是为什么这样设计?这又是对内存和计算效率(时间)之间的权衡

应该是减少对内存的需求。因为join关联必定要生成一个中间表。如果是宽表内存太大,但是窄表牺牲了关联效率。毕竟行数倍增原来十多倍。关于join的原理请看我另一份博客。

年前和项目老大聊了一会。他设计这个报表。感觉大佬的想法很nice。

hive数据仓库表设计之(矮宽表+高窄表)的更多相关文章

  1. MySQL库表设计小技巧

    前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名.字段名命名混乱.字段类型设计混乱等等,此类数据库后续极难维护与拓展.我一直相信只有优秀的库表设计 ...

  2. Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)

    在下面这篇博文里,我给各位博客们,分享了创建HBase表,但这远不止打好基础. HBase编程 API入门系列之create(管理端而言)(8) 在关系型数据库里,表的高表和宽表是不存在的.在如HBa ...

  3. 高速查询hive数据仓库表中的总条数

    Author: kwu 高速查询hive数据仓库中的条数.在查询hive表的条数,通常使用count(*).可是数据量大的时候,mr跑count(*)往往须要几分钟的时间. 1.传统方式获得总条数例如 ...

  4. Oracle 课程三之表设计

    完成本课程的学习后,您应该能够: •普通堆表优点和缺点 •理解rowid •全局临时表优点.缺点和适用场景 •分区表的类型和原理.优点和缺点.适用场景 •表字段的高效设计 •sequence的设计   ...

  5. 分布式数据库HBase表设计

    比较常用的数据库是关系型数据库,但很多场景下nosql数据库会更加擅长,从sql到nosql实施的第一步就是设计表结构,这是两种不同的思维方式,这里说下HBase表设计. 需求:需要一张stock表用 ...

  6. mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化

    可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...

  7. 常见电商项目的数据库表设计(MySQL版)

    转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...

  8. HBase概念学习(八)开发一个类twitter系统之表设计

    这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...

  9. MaxCompute表设计最佳实践

    MaxCompute表设计最佳实践 产生大量小文件的操作 MaxCompute表的小文件会影响存储和计算性能,因此我们先介绍下什么样的操作会产生大量小文件,从 而在做表设计的时候考虑避开此类操作. 使 ...

随机推荐

  1. [转]mac升级Nodejs和Npm到最新版

    第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...

  2. SQL Server数据库语法(一)

    --创建数据库 DB_CYITcreate database DB_CYITON(name='DB_CYIT',--主文件逻辑名称filename='G:\data\DB_CYIT.mdf', --文 ...

  3. 使用 Mybatis-plus 进行 crud 操作

    1 Mybatis-Plus简介 1.1 什么是Mybatis-Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化 ...

  4. php源码安装执行configure报错error: off_t undefined; check your library configuration

    php安装执行configure报错error: off_t undefined; check your library configuration vim /etc/ld.so.conf 添加如下几 ...

  5. docker 入门1 - 方向 【翻译】

    开始,第 1 部分:方向和设置 欢迎!我们很高兴您想学习 Docker.Docker 入门教程将教您如何: 设置 Docker 环境(当前步骤) 生成映像并将其作为一个容器运行 缩放应用以运行多个容器 ...

  6. 作业3:java对象模型

    一 对象表示机制 1 Hotsplot JVM内部对象表示系统 (1)OOP-Klass二分模型 OOP:Ordinary Object Pointer 或者OOPS.即普通对象指针,描述对象实例信息 ...

  7. 排查RabbitMQ安装错误

    1.注册表中是否有  HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ 此项.(须有) 2.安装目录是否存在中文.(不可有 ...

  8. 使用百度echarts仿雪球分时图(三)

    这章节将完成我们的分时图,并使用真实的数据来进行展示分时图. 一天的交易时间段分为上午的09:30~11:30,下午的13:00~15:00两个时间段,因为分时间段的关系,数据是不连续的,所以会先分为 ...

  9. 如何查找SAP Fiori launchpad Designer的准确路径即url地址

    比如我们知道在SPRO里下面这个路径的customizing activity里打开Fiori Launchpad designer: SAP Netweaver->UI technologie ...

  10. ThinkPHP模板继承和修改title

    先说下模板继承: 假定:在View文件夹中 -> Public  公共模块 —>base/header/top/footer 4个html文件 这下面base文件使用include引入其他 ...