如今Bigtable型(列族)数据库应用越来越广,功能也很强大。但是很多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表、存储、查询。本文以hbase举例讲述数据模式的变化。
传统关系型数据库(mysql,oracle)数据存储方式主要如下:
图一
上图是个很典型的数据储存方式,我把每条记录分成3部分:主键、记录属性、索引字段。我们会对索引字段建立索引,达到二级索引的效果。
但是随着业务的发展,查询条件越来越复杂,需要更多的索引字段,且很多值都不存在,如下图:图二
上图是6个索引字段,实际情况可能是上百个甚至更多,并且还需要根据多个索引字段刷选。查询性能越来越低,甚至无法满足查询要求。关系型数据里的局限也开始显现,于是很多人开始接触NoSQL。
列族数据库很强大,很多人就想把数据从mysql迁到hbase,存储的方式还是跟图一或者图二一样,主键为rowkey。其他各个字段的数据,存储一个列族下的不同列。但是想对索引字段查询就没有办法,目前还没有比较好的基于bigtable的二级索引方案,所以无法对索引字段做查询。
这时候其实可以转换下思维,可以把数据倒过来,如下图:
图三
把各个索引字段的值作为rowkey,然后把记录的主键和属性值按照一定顺序存在对应rowkey的value里。上图只有一个列族,是最简单的方式。 Value里的记录可以设置成定长的byte[],多个记录集合通过移位快速查询到。
但是上面只适合单个索引字段的查询。如果要同时对多个索引字段查询,图三的方式需要求取出所有value值,比如查询“浙江”and“手机”,需要取出两个value,再解析出各自的主键求交。如果每条记录的属性有上百个,对性能影响很大。
接下来的变化是解决多索引字段查询的问题。我们将主键字段和属性字段分开存储,储存在不同的列族下,多索引查询只需要取出列族1下的数据求交,再去最小集合的列族2里取得想要的值。储存如图四:
图四
以上图数据举例:查询“浙江”AND“手机”:
1、取出“浙江”、“手机”列族1下的数据,即{1,2,5}、{2,6}
2、对数据求交后得到{2}满足条件,{2}在”手机”(最小集合)下的index为{1}
3、取出“手机”列族二的数据,根据步骤2的index,取出结果{108,2,22234,12}
为什么是不同列族,而不是一个列族下的两个列?
列族数据库数据文件是按照列族分的。在取数据时,都会把一个列族的所有列数据都取出来,事实上我们并不需要把记录明细取出来,所以把这部分数据放到了另一个列族下。
接下来是对列族2扩展,列族2储存更多的列,用来做各种刷选、计算处理。如下图:图五
后来我感觉这玩样越来越像搜索了。。。
这是一个很典型的通过空间换时间的方案,通过大量数据冗余来提高查询性能。同时也带来了问题,就是数据一致性的问题。所以这种方案的应用场景是对海量历史数据做实时计算上。关于应用场景可以看我之前写的一篇文章:实时计算应用场景
而处理实时更新的数据或者经常修改的数据还是难点问题,也欢迎讨论或者加入我们团队一起解决这些难题。
- 大小: 36.5 KB
- 大小: 46.1 KB
- 大小: 28 KB
- 大小: 31.6 KB
- 大小: 38.2 KB
分享到:
相关推荐
2. **列导向**:与传统的关系型数据库不同,HBase以列族为单位存储数据,这使得数据读取更加高效,尤其适合大数据分析场景。 3. **实时读写**:HBase支持实时的数据读写操作,适合在线服务和大数据实时处理。 4. **...
后关系型数据库提供三种方式访问数据:对象访问、SQL访问、直接对多维数据数组访问。而且三种访问方式能够并发访问同一数据。多维数据结构和多种数据库访问方式构成了后关系型数据库的基础。从目前来看,后关系型...
转换的难点在于如何在不丢失数据关系的前提下,将SQL Server中的关系型数据模式转换为HBase的列族模式。文章提出了解决方案,其中关键步骤包括: 1. 模式转换:需要将SQL Server中的表结构转换为HBase的表结构,这...
非关系型数据库(NoSQL)是一种不同于传统的关系型数据库的数据存储模型。在信息化时代,随着大数据、云计算和互联网应用的快速发展,NoSQL数据库因其高可扩展性、高性能、灵活的数据模型等特点,逐渐受到广泛的关注...
文档具体讲解了 Sqoop 搭配 Hadoop、HBase 使用时的基本准备流程,详尽解析利用 Sqoop 把 MySQL 等关系型数据库中的记录迁移到 HBase 表的操作步骤及命令参数含义,并简述了逆向导出的可能性及其限制条件。...
- **配置hbase-site.xml**:编辑`/usr/local/hbase/conf/hbase-site.xml`,设置`hbase.rootdir`为HDFS上的存储路径,并将`hbase.cluster.distributed`设为`true`,指定HBase在分布式模式下运行。 3. **环境变量...
非关系型数据库(NoSQL,Not Only SQL)是一种不同于传统的关系型数据库的数据存储模型,它在近年来得到了广泛的关注和应用,特别是在大数据、实时分析、分布式系统等领域。NoSQL数据库的设计理念在于灵活性、可扩展...
- 数据存储:关系型数据库通常磁盘存储,非关系型数据库可选择内存或磁盘。 5. 其他差别 - 扩展性:非关系型数据库具有更好的水平扩展性,能应对大规模数据和高并发。 - 数据一致性:关系型数据库数据一致性高,非...
随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两种主流的信息管理工具,各自在特定场景下展现出了独特的优势。本文旨在深入探讨Lucene与关系型数据库之间的差异,尤其是它们在全文检索...
关系型数据库基于关系模型,其中数据以表格形式存储,每个表格称为一个表,表由行(记录)和列(字段)组成。表与表之间可以通过主键和外键建立关联,形成多表关系。例如,员工表和部门表可以通过部门ID关联,实现...
关系型数据库是基于关系模型的数据存储方式,它的核心概念是二维表格,其中数据以行和列的形式组织。关系模型由埃德加·科德在1970年提出,这种数据库系统提供了强大的数据一致性、完整性和事务处理能力。常见的关系...
阿里云分布式关系型数据库 DRDS 是一种云原生、分布式的关系型数据库,它提供了高性能、可扩展、安全可靠的数据存储和处理能力。为了帮助开发者更好地使用 DRDS,阿里云提供了 DRDS 最佳实践指南,旨在帮助开发者更...
例如,在需要高性能和高扩展性的场景下,可以使用NoSQL数据库来存储大规模数据,而在需要ACID事务和强一致性的场景下,可以使用关系型数据库来存储关键数据。 关系型数据库和NoSQL数据库都是数据库技术的重要组成...