Hbase的数据模型
row 行
column 列
row keys 行键
column keys 列键
column families 列族
Hbase的数据模型和Bigtable的数据模型是一致的,非常适用于数据密集型的系统.
简单的说,Hbase可以简化描述为一个Map<byte[], Map<byte[], Map<byte[], Map<Long, byte[]>>>>.
一个Map建立行键和它们的列族的映射关系;第二个Map建立列族和列键的映射关系;第三个Map建立列键和时间戳的映射关系;
最后一个Map将时间戳对应到一个值上.键通常情况下为string,时间戳是个long,值为字节数组.列键通常包含它的族名例如:family:key.
一个列族可以包含无限多的列键值.所以想获得一个值,使用者需要使用get命令指定3个键来获取:
row key+column key+timestamp -> value
行
Hbase的行键是一个字节数组,但是这个数组必须有一个字符串名称,这个名词是按照字典顺序建立的,相当于索引。例如:1到100这100个数是
按照如下次序存放:1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,...,9,91,92,93,94,95,96,97,98,99
现实例子:
为了能够更好地说明Hbase的数据模型,下面介绍一个简单的blog的数据结构设计.
假设一个blog具有如下特性:
1:blog实体,包括标题,副标题,日期,作者,类别(也就是标签),内容和评论.对于登录的用户,可以创建和更新.
2:用户,包含用户名,密码和昵称,可以登录和登出.
3:评论,包括标题,作者,内容.评论可以由匿名用户产生,这个时候,通过验证码来区分用户.
实体关系图(ERD)如下:
BLOGENTRY USER
PK:id_blogentry ----------> PK:id_user
FK1: name
title login
under_title password
id_user
date COMMENT
text <----------PK:id_comment
type FK1:id_blogentry
date
author
title
text
对应的Hbase架构:
Table | Row Key | Family | Attributs |
blogtable | TTYYYYMMDDHHmmss | info: | Always contains the column keys author,title,under_title. Should be IN-MEMORY and have a 1 version |
|
| text: | No column key. 3 versions |
|
| comment_title: | Column keys are written like YYYMMDDHHmmss. Should be IN-MEMORY and have a 1 version |
|
| comment_author: | Same keys. 1 version |
|
| comment_text: | Same keys. 1 version |
usertable | login_name | info: | Always contains the column keys password and name. 1 version |
参考wiki: