关系型数据库与HBase的数据储存方式差别
现在Bigtable型(列族)数据库应用越来越广,功能也非常强大。
可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表、存储、查询。
本文以hbase举例讲述数据模式的变化。
传统关系型数据库(mysql,oracle)数据存储方式主要例如以下:
图一
上图是个非常典型的数据储存方式。我把每条记录分成3部分:主键、记录属性、索引字段。我们会对索引字段建立索引,达到二级索引的效果。
可是随着业务的发展。查询条件越来越复杂,须要很多其它的索引字段,且非常多值都不存在,例如以下图:
图二
上图是6个索引字段。实际情况可能是上百个甚至很多其它,而且还须要依据多个索引字段刷选。
查询性能越来越低,甚至无法满足查询要求。关系型数据里的局限也開始显现。于是非常多人開始接触NoSQL。
列族数据库非常强大。非常多人就想把数据从mysql迁到hbase,存储的方式还是跟图一或者图二一样,主键为rowkey。其它各个字段的数据。存储一个列族下的不同列。
可是想对索引字段查询就没有办法,眼下还没有比較好的基于bigtable的二级索引方案,所以无法对索引字段做查询。
这时候事实上能够转换下思维。能够把数据倒过来,例如以下图:
图三
把各个索引字段的值作为rowkey,然后把记录的主键和属性值依照一定顺序存在相应rowkey的value里。上图仅仅有一个列族。是最简单的方式。 Value里的记录能够设置成定长的byte[],多个记录集合通过移位高速查询到。
可是上面仅仅适合单个索引字段的查询。假设要同一时候对多个索引字段查询,图三的方式须要求取出全部value值,比方查询“浙江”and“手机”。须要取出两个value,再解析出各自的主键求交。假设每条记录的属性有上百个,对性能影响非常大。
接下来的变化是解决多索引字段查询的问题。我们将主键字段和属性字段分开存储,储存在不同的列族下,多索引查询仅仅须要取出列族1下的数据,再去最小集合的列族2里取得想要的值。储存如图四:
图四
为什么是不同列族,而不是一个列族下的两个列?
列族数据库数据文件是依照列族分的。
在取数据时,都会把一个列族的全部列数据都取出来。其实我们并不须要把记录明细取出来。所以把这部分数据放到了还有一个列族下。
接下来是对列族2扩展。列族2储存很多其它的列,用来做各种刷选、计算处理。例如以下图:
图五
后来我感觉这玩样越来越像搜索了。。。
关系型数据库与HBase的数据储存方式差别的更多相关文章
- Android下的数据储存方式(三)
Android下最好的数据储存方式:关系型数据库sqlite. 数据库的创建:使用SqliteOpenHelper类 结合SqliteOpenHelper类和SQLiteDatabase类的帮 ...
- HBase 实战(1)--HBase的数据导入方式
前言: 作为Hadoop生态系统中重要的一员, HBase作为分布式列式存储, 在线实时处理的特性, 备受瞩目, 将来能在很多应用场景, 取代传统关系型数据库的江湖地位. 本篇博文重点讲解HBase的 ...
- Android下的数据储存方式
安卓系统默认提供了一下几种数据储存的方式: Shared Preferences 内部储存 外部储存 SQLite数据库 保存到网络服务器 使用Shared Preferences ...
- PHP 数据库驱动、连接数据不同方式学习笔记
相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.ph ...
- RDBMS关系型数据库与HBase的对比
关系型数据库 结构: * 数据库以表的形式存在 * 支持FAT.NTFS.EXT.文件系统 * 使用Commit log存储日志 * 参考系统是坐标系统 * 使用主键(PK) * 支持分区 * 使用行 ...
- Android下的数据储存方式( 二)
在上一篇文章中我们介绍了SharedPreferences的使用方法. 今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存 每一个Android设备都拥有两个数据储存区域:外部储存和外部储存 ...
- 11.1 js中级,数据类型、数据储存方式、作用域内存空间的区别以及例识别。
一. 基本数据类型和引用数据类型的区别. 1.基本数据类型:基本数据类型就是简单的操作值. 2.引用数据类型:就是把引用的地址赋给变量. 堆内存: 就是存放代码块的,存放形式有两种 1)对象以键值对的 ...
- 建模:通过ES平铺关系型数据库多表的数据
问:建模要从一个限界上下文中来建模,是否可以简单的把几张表进行笛卡尔乘积方式的平铺? 答:不能,原因之一,数据量会急剧增长:原因之二,这样的平铺是毫无意义的,必须要定义一个维度,在这个维度上根据需求约 ...
- Android SQLite数据储存方式
SQLiteOpenHelper 类 用SQLiteOpenHelper 类中的 getWritableDatabase()和getReadableDatabase()方法可以获得数据库的引用. 为了 ...
随机推荐
- 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree
一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现 ...
- “发布后tomcat中的classes目录为空”问题
办法:Project-clean,ok,问题解决.
- Shiny学习实践01
Shiny是什么东东? 官方描述: Shiny is an R package that makes it easy to build interactive web apps straight fr ...
- I2C controller core之Bit controller(02)
4 generate clock and control signals 1 -- architecture signal iscl_oen, isda_oen : std_logic; -- int ...
- C#的WebBrowser操作frame
刚学c#不久,也不太懂什么IHTMLDocument.IHTMLDocument2.IWebBrowser2等等.自己琢磨了好久,终于知道了怎么用WebBrowser操作frame和iframe. 1 ...
- JSP状态管理_1_Cookie
http协议的无状态性:当浏览器发送请求飞服务器时,服务器相应客户端请求:但当同一个浏览器再次发送请求给浏览器时,服务器并不知道它就是刚才那个客户端. 保存用户状态的两大机制:Session,Cook ...
- 关于图片和auido预加载
预加载老生常谈: funtion preLoadImages(imageArr){ var self = this; var newimages=[], loadedimages=0 var post ...
- 【转载】java中的反射
主要介绍以下几方面内容 理解 Class 类 理解 Java 的类加载机制 学会使用 ClassLoader 进行类加载 理解反射的机制 掌握 Constructor.Method.Field 类的用 ...
- Git创建本地分支并关联远程分支(二)
创建本地分支git branch 分支名 例如:git branch dev,这条命令是基于当前分支创建的本地分支,假设当前分支是master(远程分支),则是基于master分支创建的本地分支dev ...
- 2019 gplt团体程序设计天梯赛总结
分很菜… 以后写题一定记得把题意理清楚了再开始写. 模拟题还是大坑,代码还是写得不够多,代码量一大就写bug. 补题 l1-8 估值一亿的AI核心代码 补题链接:https://pintia.cn/p ...