Hbase 文档清楚地表明您应该将类似的列分组到列族中,因为物理存储是由列族完成的。
但是,将两个列族放入同一个表中,而不是每个列组有单独的表,这意味着什么?是否存在以这种方式“分区”表更有意义的特定情况,以及一个“宽”表效果更好的情况?
单独的表应该导致单独的“行区域”,当某些列族(作为一个整体)非常稀疏时,这可能是有益的。相反,什么时候将列族聚集在一起是有利的?
Hbase 文档清楚地表明您应该将类似的列分组到列族中,因为物理存储是由列族完成的。
但是,将两个列族放入同一个表中,而不是每个列组有单独的表,这意味着什么?是否存在以这种方式“分区”表更有意义的特定情况,以及一个“宽”表效果更好的情况?
单独的表应该导致单独的“行区域”,当某些列族(作为一个整体)非常稀疏时,这可能是有益的。相反,什么时候将列族聚集在一起是有利的?
您已经了解了列族的概念:基本上,它只是提示 HBase 将这些项目存储和复制在一起以便更快地访问。
如果您将两个列族放在同一个表中,并且始终使用不同的键来访问它们,那么这实际上与将它们放在两个单独的表中是一回事。您只能通过在同一个表中拥有两个通过相同键访问的列族获得收益。
例如:如果我有给定网站的总浏览量、同一网站的唯一浏览量、用户用于查看该网站的浏览器以及他们的互联网连接的列,我可以决定我想要前两个是列族,后两个是另一个列族。在这里,所有四个都通过相同的键访问,即所讨论的网站,所以我通过将它们放在同一个表中获得了收益。
如果它们在不同的表中,我最终将不得不对两个表进行类似连接的操作。我真的不知道这些数字,所以我不能真正告诉你类似连接的操作有多慢(因为我不记得 HBase 有一个连接,因为它是非关系的)以及分裂的临界点是什么将它们放在单独的表中比将它们放在同一个表中(反之亦然)更重要。
当然,这一切都取决于您要存储的数据,因此如果您永远不需要跨表连接,您可能希望将它们保存在单独的表中,因为您可能会争辩说它们彼此之间没有那么相关首先。
列族是面向行与面向列访问之间的折衷。为了扩展 Chris 的网页示例,行访问将获取单个网站的所有数据(列)。面向列的操作的一个示例是对所有站点的页面浏览量求和。
后一种操作不需要浏览器和连接详细信息,这些详细信息远大于视图计数的数值,并且会显着影响查询性能。因此,HBase 提供了列族作为支持列操作的优化。
至于列是否应该在同一个表中......如果它们是同一实体的属性,我只会遵循正常的数据建模准则并将所有列放在同一个表中。列族是关于性能而不是模式。