1一对一的设计
本身hbase就支持宽表,直接合并到一张表中,将常用的索引整合到RowKey中
2、一对多的设计
DBMS典型表结构:
父表:父表唯一ID,父表信息
子表:父表唯一ID,子表序列号,子表信息
方案1:
父表结构基本不变,更改子表结构
父表
Row Key | CF |
父表信息 | |
父表唯一ID | 附表信息的映射 |
子表
Row Key | CF |
子表信息 | |
父表唯一ID+子表序列号 | 子表信息的映射 父表唯一ID |
方案2:
父表保存相关的子表id,子表基本不变
父表
Row Key | CF | CF |
父表信息 | 子表Item的ID信息 | |
父表唯一ID | 附表信息的映射 | 子表id |
说明:子表ID的信息,可以动态的增加对应的子表id
子表
Row Key | CF |
子表信息 | |
子表序列号(这种情况需要序列号唯一) | 子表信息的映射 父表唯一ID |
3、多对多表设计
DBMS典型表结构:
A表:A表唯一ID,A表信息
关联表:A表唯一ID,B表唯一ID
B表:B表唯一ID,B表信息
A表
Row Key | CF |
A表信息 | |
A表唯一ID | A表信息的映射 |
B表
Row Key | CF |
B表信息 | |
B表唯一ID | B表信息的映射 |
关联表
Row Key | CF |
关联信息 | |
A表唯一ID+B表唯一ID | 关联信息的映射 |
4、二级索引
从数据库表更改为Hbase表后,因为hbase没有二级索引,所以为了满足查询要求,一在RowKey上的选择要好好设计,但rowkey本身也还是有长度限制,不可能将所有放入,如果需要根据对应的查询建立对应的查询表。基本原理如下:
关联表
Row Key | CF |
查询信息 | |
查询相关ID | 查询信息映射 |
设计要点:
1>主表数据的RowKey的前缀和索引数据在一个表中,二个CF
2>主表数据和索引数据的RowKey的前缀要保持一致,这样尽量的将数据落在一个hbase的Region上,方便查询
总结:和数据库一样,仍然是按照时间换取空间的做法来使用。
参考例子为;http://www.cnblogs.com/MOBIN/p/5579088.html
主数据RowKey:出发点、目的地、性价比
主数据CF: 相关的详细信息
索引数据RowKey: 出发点、目的地、旅游天数、....
索引数据信息:主数据RowKey
查询过程:根据条件从索引数据获得对应的主数据的RowKey(需要进行过滤),然后根据RowKey获得数据,因为RowKey的前缀一致,所以保证了绝大多数的数据在一个Region上,这个方法和kylin的设计理念一致