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

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

(每个领域都有主表,每次往这个领域(库)添加新表的时候一般都会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. centos7服务搭建常用服务配置之二:Rsync+sersync实现数据实时同步

    目录 1.RSYNC数据备份 1.1 rsync服务简介 1.2 rsync特点和优势 1.3 rysnc运行模式简介 1.4 数据同步方式 2 Rsync实验测试 2.1 实验环境说明 2.2 服务 ...

  2. [Cometoj#4 B]奇偶性_打表

    奇偶性 题目链接:https://cometoj.com/contest/39/problem/B?problem_id=1577 数据范围:略. 题解: 因为$f$的构造原因,很容易找到规律. 进而 ...

  3. GFS(Google File System,谷歌文件系统)----(1)读写一致性

    GFS副本控制协议--中心化副本控制协议 对于副本集的更新操作有一个中心节点来协调管理,将分布式的并发操作转化为单点的并发操作,从而保证副本集内各节点的一致性.在GFS中,中心节点称之为Primary ...

  4. MyBatis配置文件中的标签mappers的子标签mapper的url属性

    在浏览器中输入file:/可以打开访达根目录,file:后面至少跟一个杠 MyBatis配置文件中的标签mappers的子标签mapper的url属性中file:后面至少要跟两个杠

  5. # Ubuntu子系统安装配置

    目录 Ubuntu子系统安装配置 安装配置 终端美化 卸载 和win10之间的交互 Ubuntu子系统安装配置 亲测启动速度毫秒之间 安装配置 系统升级到一周年正式版及以上(1607) 依次在 设置 ...

  6. lg 1478

    好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...

  7. rabbitmq消息队列,消息发送失败,消息持久化,消费者处理失败相关

    转:https://blog.csdn.net/u014373554/article/details/92686063 项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败. ...

  8. 优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)

    优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam) 2019年05月29日 01:07:50 糖葫芦君 阅读数 455更多 ...

  9. c++11 用户定义字面量

    c++11 用户定义字面量 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inc ...

  10. 在Android8.0以上收不到广播问题(AppWidget)

    对Intent指定组件 //安卓8.0必须添加 intent.setComponent(new ComponentName(context,MyAppWidgetProvider.class)); 问 ...