我来自RDBMS背景,最近开始阅读HBase。我知道没有二级索引,我们不应该尝试做类似的事情:
SELECT * FROM tbl_photo WHERE album_id = 1969
我想知道是否所有信息都可以用来创建一个行密钥。
例如。有一个用户将他/她的电子邮件注册到照片共享服务提供商。用户可以创建相册(可以创建多个相册)并将照片上传到相册。另一位用户评论了这些照片,一些用户对评论进行了评论。
识别此类投票的关键可能看起来像email:album:ts:photo:ts:comment:ts:vote:ts
。
这个键有意义吗?它比推荐时间长吗? (ts stands timestamp
)
答案 0 :(得分:7)
在某种程度上,这确实有意义,但如果您的所有信息都在您的密钥中,您会在列中存储什么?从客户端应用程序的角度来看,您是否始终能够形成该密钥? HBase架构设计是一个非常困难的话题,如果你有空闲时间,你一定要看看去年HBaseCon的视频:HBase Schema Design by Ian Varley。
就我而言,在设计HBase行密钥时要记住的最重要的事情是“我将如何检索我的数据?”。
如果您(如您的示例中)想要从特定相册中检索图片,为什么不将行键设为email:album
,让不同的列族存储您的图片,评论,...... < / p>
现在,当您按照这种方式进行操作并且想要检索特定图片时,您将需要扫描所有相册。因此,为了防止这种情况,您可以使用email:picture
作为密钥,但这只会产生相同的问题。您也可以使用email:album:picture
,但如果您想要从特定相册中获取所有图片,您应该知道图片的标识符,否则您将无法形成您的密钥。
另一方面,如果用户可以例如只有2000张图片,那么使用email:picture
或email:album
作为关键字并指定album
或picture
的列过滤器这是一个问题,HBase将循环最多2000行,这不会花费那么长的时间。
话虽如此,根据您使用的HBase版本,您可以使用FuzzyRowFilter实现某种二级索引。