6

我来自 RDBMS 背景,最近开始阅读 HBase。我知道没有二级索引,我们不应该尝试做类似的事情:

SELECT * FROM tbl_photo WHERE album_id = 1969

我想知道是否所有信息都可以用来创建行键本身。

例如。有一个用户在照片共享服务提供商处注册了他/她的电子邮件。用户可以创建一个相册(可以创建多个相册)并将照片上传到它。另一个用户对照片发表评论,一些用户对评论投赞成票/反对票。

识别这种投票的关键可能看起来像email:album:ts:photo:ts:comment:ts:vote:ts。这把钥匙有意义吗?它比推荐的要长吗?( ts stands timestamp)

4

1 回答 1

8

从某种意义上说,这确实是有道理的,但是如果您的所有信息都在您的密钥中,您会在列中存储什么?您是否总是能够从客户端应用程序的角度形成该密钥?HBase 模式设计是一个相当困难的话题,如果您有空闲时间,您绝对应该观看去年 HBaseCon 的视频:Ian Varley 的 HBase Schema Design

就我而言,在设计 HBase 行键时要记住的最重要的事情是“我将如何检索我的数据?”。

如果您(如在您的示例中)想要从特定相册中检索图片,为什么不将行键设置为类似email:album,让不同的列族存储您的图片、评论、...

现在,当您这样做并且想要检索特定图片时,您必须扫描所有相册。因此,为了防止这种情况,您可以email:picture改为使用 as key,但这只会反过来产生同样的问题。您也可以使用email:album:picture,但是如果您想从特定相册中获取所有图片,您应该知道图片的标识符,否则您将无法形成您的密钥。

另一方面,如果用户例如只能拥有 2000 张图片,则使用email:pictureoremail:album作为键并指定列过滤器albumpicture不会成为问题,那么 HBase 将循环最多 2000 行,这不会花费那么长时间。

话虽如此,根据您使用的 HBase 版本,您可以使用FuzzyRowFilter实现某种二级索引。

于 2013-03-14T14:09:18.133 回答