您在HBase FAQ中阅读的第一个示例模式之一是许多关系的Student-Course示例。架构在Student表中有一个Courses列,在Course表中有一个Students列。
但我不明白如何在HBase中保证这两个对象之间的完整性。如果在更新一个表和另一个表之间出现问题,我们就会遇到问题。
我看到有一个交易设施,但是在每个Put上使用它的成本是多少?或者还有其他方法可以考虑这个问题吗?
答案 0 :(得分:2)
我们遇到了同样的问题。
我为hbase开发了一个商业插件,用于处理您提及的交易和关系问题。具体来说,我们将DataNucleus用于JDO兼容环境。我们的插件列在此页http://www.datanucleus.org/products/accessplatform_3_0/datastores.html上,您也可以直接访问我们的小型博客http://www.inciteretail.com/?page_id=236。
我们利用JTA进行交易服务。因此,在您的情况下,我们将处理关系问题以及索引表的任何插入(难以拥有没有索引查找和排序的应用程序!)。
答案 1 :(得分:1)
如果没有其他日志,您将无法保证这两个对象之间的完整性。 HBase仅在行级别具有原子更新。您可以使用该属性来创建可在失败后恢复的Tx日志。
答案 2 :(得分:0)
如果必须将两个INSERT作为单个工作单元执行,则意味着必须使用事务管理器来保留ACID属性。没有其他方法可以考虑我所知道的问题。
成本不是引用完整性的问题。正确编码,不要担心性能。您的代码将首先查找性能问题,而不是事务管理器。
答案 3 :(得分:0)
逻辑关系模型使用两种主要的关系:一对多和 许多到很多。关系数据库将前者直接建模为外键(是否为 由数据库明确强制执行为约束,或由您隐式引用 应用程序作为查询中的连接列),后者作为连接表(附加 表,其中每一行代表两个main之间关系的一个实例 表)。 HBase中没有这些直接映射,通常归结为 规范化数据。 首先要注意的是HBase,没有任何内置的连接或约束, 几乎没有用于明确的关系。您可以轻松地放置一对一的数据 很多在性质上进入HBase表:但 这只是前一个表中某些行的某些部分发生的关系 对应于后一表中rowkeys的部分。 HBase一无所知 关系,所以由你的应用程序来做它(如果有的话)。