我在HBase上看过视频教程,数据存储在这样的表中:
EmployeeName - Height - ProjectInfo
------------------------------------
Jdoe - 5'7" - ProjA-TeamLead, ProjB-Contributor
当某些业务需求出现时,ProjA的名称必须更改为ProjX会发生什么? 不存在项目信息存储的单独表格吗?
答案 0 :(得分:1)
在关系数据库中,是:您有一个项目表,employee表将通过外键引用它,并且只存储不可变项目ID(而不是名称)。然后当你想查询它(在关系数据库中)时,你会做一个像:
这样的JOINSELECT
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这样的系统就是在设计过程中预先支付这些成本,而不仅仅是假设关系数据库会为你大规模地神奇地解决这样的问题。 (因为它不会)。
那就是说:如果你不希望至少拥有Terabtyes数据(这是一百万MB,请记住),只需在关系数据库中进行。这会容易得多。
答案 1 :(得分:0)
我认为通过这个演讲会给你一些观点:
http://ianvarley.com/coding/HBaseSchema_HBaseCon2012.pdf
要获得更多程序性表示,请查看:
http://jimbojw.com/wiki/index.php?title=Understanding_Hbase_and_BigTable