noSQL回滚功能

时间:2014-06-13 14:38:28

标签: cassandra couchbase infinispan nosql

我是noSQL技术的新手,我很惊讶没有任何交易支持。我的主要问题是当我完成一些插入任务时,插入包含~5个单独的插入。我们必须通过4个不同的ID找到一份文件。问题是该文档相当大,并且存储起来非常昂贵:

  • 键|值


  • user1 HugeDoc1

  • user2 HugeDoc1
  • user3 HugeDoc1

因此,我们提出了一个内部标识,指向该文档。是的,我知道这个设计有点违反了整个noSQL概念,但它节省了大量内存。如果文档插入失败,则ID没有意义,应该删除。 编写自己的回滚处理,跟踪成功的插入/更新是一个好主意吗?或者整个概念是错误的?

3 个答案:

答案 0 :(得分:5)

  

我知道这个设计有点违反了整个noSQL概念,但它节省了大量内存。

这是一种非常1970年代的思维方式。关系数据库理论起源于磁盘空间昂贵的时候。 1975年,IBM以兆字节 11,000美元的价格销售硬盘。到1980年价格下降,你可以以不到100万美元的价格购买一块千兆字节的存储空间。今天,您可以花费60美元购买NewEgg并购买一个TB级硬盘。现在磁盘空间很便宜,处理时间是昂贵的部分。

在非关系型(NoSQL)数据建模中,您应该根据查询数据的方式构建表结构。这与关系数据建模不同,您可以根据存储数据的方式来构建表。通常情况下,基于查询的建模会导致存储冗余数据...... ,这没关系。速度数据重复,完整性参考数据。

  

编写自己的回滚处理是一个好主意,跟踪   成功插入/更新?或者整个概念是错误的?

我参与了一个Cassandra项目,在那里我们实现了类似于应用程序端事务/回滚的东西。它真的不能很好地工作,并最终创建了几个墓碑。最后,我会问你自己为什么你的应用程序需要一个非关系数据库,因为听起来你仍然需要一些关系数据库的好处。如果您确定您绝对需要非关系数据库,那么您可能需要重新考虑数据建模方法。

答案 1 :(得分:3)

如果你使用支持生存时间(TTL)的NoSQL数据库,比如Aerospike,一种方法是首先使用短TTL编写文档记录,然后编写映射外部ID的映射记录 - - >内部Id。

成功完成所有映射记录后,触摸文档记录并更新文档上的TTL以适合您的使用案例。

外部ID失败 - >内部Id记录,只允许短TTL过期,数据库将清理它。

这是部分2PC方法。如果您的数据库延迟很小(小于5毫秒),它将起作用。这可能是好的恩赐

这种算法在AdTech行业中成功使用,它们将映射和外部ID(如cookie或移动设备ID)和内部用户配置文件一起使用。

答案 2 :(得分:2)

远离交易,从ACID迁移到BASE,在灵活性和可调扩展性方面具有巨大优势。 Dan Pritchett spoke关于他们对交易性需求的重新思考,以及真正需要交易的有限环境。阅读亚马逊的Dynamo白皮书,该白皮书解释了无交易数据库的优势。

心态发生了变化。如果您尝试使用关系模式使用后关系数据库,您将对结果不满意,就像人们在应用使用关系前数据库学习的模式时对关系数据库不满意一样。