我是noSQL技术的新手,我很惊讶没有任何交易支持。我的主要问题是当我完成一些插入任务时,插入包含~5个单独的插入。我们必须通过4个不同的ID找到一份文件。问题是该文档相当大,并且存储起来非常昂贵:
键|值
user1 HugeDoc1
因此,我们提出了一个内部标识,指向该文档。是的,我知道这个设计有点违反了整个noSQL概念,但它节省了大量内存。如果文档插入失败,则ID没有意义,应该删除。 编写自己的回滚处理,跟踪成功的插入/更新是一个好主意吗?或者整个概念是错误的?
答案 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)