关系型数据库到HBase的数据储存方式变迁

如今Bigtable型(列族)数据库应用越来越广,功能也很强大。但是很多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表、存储、查询。本文以hbase举例讲述数据模式的变化。

传统关系型数据库(mysql,oracle)数据存储方式主要如下:

图一

上图是个很典型的数据储存方式,我把每条记录分成3部分:主键、记录属性、索引字段。我们会对索引字段建立索引,达到二级索引的效果。

但是随着业务的发展,查询条件越来越复杂,需要更多的索引字段,且很多值都不存在,如下图:

图二

上图是6个索引字段,实际情况可能是上百个甚至更多,并且还需要根据多个索引字段刷选。查询性能越来越低,甚至无法满足查询要求。关系型数据里的局限也开始显现,于是很多人开始接触NoSQL。

列族数据库很强大,很多人就想把数据从mysql迁到hbase,存储的方式还是跟图一或者图二一样,主键为rowkey。其他各个字段的数据,存 储一个列族下的不同列。但是想对索引字段查询就没有办法,目前还没有比较好的基于bigtable的二级索引方案,所以无法对索引字段做查询。

这时候其实可以转换下思维,可以把数据倒过来,如下图:

图三

把各个索引字段的值作为rowkey,然后把记录的主键和属性值按照一定顺序存在对应rowkey的value里。上图只有一个列族,是最简单的方式。 Value里的记录可以设置成定长的byte[],多个记录集合通过移位快速查询到。

但是上面只适合单个索引字段的查询。如果要同时对多个索引字段查询,图三的方式需要求取出所有value值,比如查询“浙江”and“手机”,需要取出两个value,再解析出各自的主键求交。如果每条记录的属性有上百个,对性能影响很大。

接下来的变化是解决多索引字段查询的问题。我们将主键字段和属性字段分开存储,储存在不同的列族下,多索引查询只需要取出列族1下的数据,再去最小集合的列族2里取得想要的值。储存如图四:

图四

为什么是不同列族,而不是一个列族下的两个列?

列族数据库数据文件是按照列族分的。在取数据时,都会把一个列族的所有列数据都取出来,事实上我们并不需要把记录明细取出来,所以把这部分数据放到了另一个列族下。

接下来是对列族2扩展,列族2储存更多的列,用来做各种刷选、计算处理。如下图:

图五

后来我感觉这玩样越来越像搜索了。。。

时间: 2024-11-02 00:21:02

关系型数据库到HBase的数据储存方式变迁的相关文章

PHP 数据库驱动、连接数据不同方式学习笔记

目录   1. PHP数据库驱动简介 2. PHP连接数据库的不同方式      1. PHP数据库驱动简介   驱动是一段设计用来于一种特定类型的数据库服务器进行交互的软件代码.驱动可能会调用一些库.类似于Java中的数据库驱动的概念   复制代码 1. JDBC-ODPC桥: 它将JDBC API映射到ODPC API.再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll) 2. 本地API驱动 直接将JDBC API

关系型数据库中的关键技术

存储引擎 MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系. 由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景. MyISAM 1.特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用 表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能 读写互相阻塞:不仅会在写入的时

《Python Cookbook(第3版)中文版》——6.8 同关系型数据库进行交互

6.8 同关系型数据库进行交互 6.8.1 问题 我们需要选择.插入或者删除关系型数据库中的行数据. 6.8.2 解决方案 在Python中,表达行数据的标准方式是采用元组序列.例如: stocks = [ ('GOOG', 100, 490.1), ('AAPL', 50, 545.75), ('FB', 150, 7.45), ('HPQ', 75, 33.2), ] 当数据以这种形式呈现时,通过Python标准的数据库API(在PEP 249中描述)来同关系型数据库进行交互相对来说就显得很

数据库一体机与大数据技术区别何在?

作为近期信息管理领域最为热门的两项技术,数据库一体机与大数据技术的硬件架构基本相同,但软件体系有着本质的区别,这也导致了两者拥有不同的特征表现. 随着企业数据量的快速增长,以及用户对服务水平要求的不断提高,相当长的一段时间以来,传统关系数据库 技术在生产实践中表现出明显的能力不足.如何以合理的成本获得海量数据的高可用性已经成为现代IT领域的重大挑战.为了应对这一挑战,近年来,IT市场中 相继出现了许多新的技术手段,其中最为引人注目的便是由主流数据库厂商主导的数据库一体机(例如Oracle Exa

qq-如何实现将数据库统计出来的数据通过QQ发送给指定的群

问题描述 如何实现将数据库统计出来的数据通过QQ发送给指定的群 数据来源:数据库统计出来的数据 展现方式:将统计出来的数据通过QQ发送给指定的群 求大神指点,目的是想做一个监控系统,将统计的结果通过QQ发出来

5种Android数据存储方式汇总_Android

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种:使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比

Android编程中的5种数据存储方式_Android

本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据      3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配置信息(如是否打开音效.是否使用震动效果.小游戏的玩家积分等),解锁口 令密

深入理解关系型数据库的数据水平切分和垂直切分

虽然在云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代,NoSQL只能作为传统数据的补充而不能将其替代,所以规避传统数据库的缺点是目前大数据时代必须要解决的问题.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷,但是由于目前开源或者商用的传统数据库基本不支持大规模自动扩展,所以就需要借助第三方来做处理,下面就来分析一下如何进行数据切分. 何为数据切分? 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,

储存方式-db2储存数据的方式,XML?

问题描述 db2储存数据的方式,XML? 1.今天装db2,创建sample发现.创建了XML文件,我用MySQL并没有见过.所以我很好奇主流数据库储存数据的方式是什么?存在什么格式的文件里?2.navicat连接mySQL,连接了整个数据库,各个子数据库都得到.而为什么dbvisual连接数据库只是仅仅连接了一个子数据库sample?3.db2的视频好少,都说db2的SQL语句和MySQL差不多,我还是伸个手,求db2入门教程. 求解答,谢谢! 解决方案 xml在数据库中起始就是以文本字段的形