Nosql 如何为相关但分离的实体创建HBase列/表

Nosql 如何为相关但分离的实体创建HBase列/表,nosql,hbase,Nosql,Hbase,我看了关于HBase的视频教程,其中数据存储在如下表中: EmployeeName-Height-ProjectInfo ----------------------------------------- Jdoe-5'7”-ProjA团队负责人,ProjB贡献者 当出现某些业务需求时,ProjA的名称必须更改为ProjX,会发生什么情况? 难道没有一个单独的表来存储项目信息吗?在关系数据库中,是的:您将有一个项目表,employee表将通过外键引用它,并且只存储不可变的项目id(而不是名称)。

我看了关于HBase的视频教程,其中数据存储在如下表中:

EmployeeName-Height-ProjectInfo

-----------------------------------------

Jdoe-5'7”-ProjA团队负责人,ProjB贡献者

当出现某些业务需求时,ProjA的名称必须更改为ProjX,会发生什么情况?
难道没有一个单独的表来存储项目信息吗?

在关系数据库中,是的:您将有一个项目表,employee表将通过外键引用它,并且只存储不可变的项目id(而不是名称)。然后,当您想要查询它(在关系数据库中)时,您将执行如下连接:

SELECT
  employee.name,
  employee.height,
  project.name,
  employee_project_role.role_name
 FROM
   employee
   INNER JOIN employee_project_role
     ON employee_project_role.employee_id = employee.employee_id
   INNER JOIN project
     ON employee_project_role.project_id = project.project_id
在HBase(和其他NoSQL数据库)中不是这样做的;原因是,由于这些数据库面向超大数据集,并且分布在许多机器上,因此透明地执行这样的复杂连接的实际算法很难以性能良好的方式实现。因此,HBase甚至没有内置连接

相反,对于这样的系统,通常的方法是将数据反规范化,并将数据存储在一个表中。因此,在这种情况下,每个员工可能有一行,反规范化到该行的是员工的所有项目角色信息(可能在单独的列中——HBase中一行的内容实际上是一个键/值映射,因此您可以轻松地表示重复的内容,例如它们的所有不同角色)

不过,您完全正确:如果您更改项目名称,这意味着您需要更改为每个员工存储的数据。在这方面,关系模型是“更干净的”。但是,如果您处理的是数PB的数据或数万亿行,“干净的”“关系数据库的抽象变得更加混乱,因为你最终不得不手动将其分割。像HBase这样的系统的目的是在设计过程中提前支付这些成本,而不仅仅是假设关系数据库会神奇地大规模为你解决这样的问题(因为它不会)


这就是说:如果您不希望拥有至少万亿字节的数据(请记住,这是一百万MB),只需在关系数据库中进行即可。这会容易得多。

我认为浏览本演示会给您一些视角:

要了解更多的编程表示,请查看:


我明白你的意思。但我只是想确认一下:如果一个项目是用HBase启动的,那么“键”的选择应该非常仔细,因为我们只有一个表来表示数据库?我想这没关系,因为HBase DB可能是为分析用户数据而创建的