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