MongoDB - 自动维护数据完整性

时间:2011-01-25 21:46:59

标签: mongodb

我有兴趣从关系数据库迁移到MongoDB以提高性能。我将在多个位置存储冗余的非规范化数据,并且想知道是否可以在没有应用程序代码的情况下自动维护数据的完整性。

例如,如果我有用户文档......

User: { _id: "...", userName: "johndoe", displayName: "John Doe", TotalTasks: 3 }

然后是一份任务文件......

Task: { _id "...", title: "Finish Reports", userID: "...", userName: "johndoe", userDiplayName: "John Doe" }

如何自动确保userName和displayName在相应的文档中保持不变?如何为此用户添加或删除新任务时确保更新TotalTask​​s?

2 个答案:

答案 0 :(得分:4)

您无法在服务器端强制执行这些约束。但是触发器是planned的东西。当前支持的唯一约束是唯一索引。

答案 1 :(得分:0)

如果没有一些外部应用程序编码,无法使用MongoDB强制执行它们。我将在上面提出的一个问题是,为什么不将任务作为用户文档的一部分?这将消除您的一致性问题,因为您可以原子地处理用户和任务。

但是,假设你不能,我过去所做的就是使用MySQL和版本字段来强制一致性。每个应用程序都不同,但基本要点如下:

1)Mongo中的每个文档在MySQL中都有一个相关的行。 MySql中的这一行将包含集合,doc的id和一些审计信息(最后更改,谁更改等) 2)确定需要锁定的文档,然后在mysql中创建可序列化的事务。 3)使用查找和更新更新mongo中的记录,并确保版本字段匹配以强制执行乐观并发。 4)如果一切都完成,那么在mysql中提交事务。 5)如果出现问题,请回滚完成的mongo中的所有操作。如果无法完成回滚,请推送信息以回滚到消息队列中,并使用单独的进程“清理”。 6)回滚mysql事务

这必须谨慎使用,因为它会给您的操作增加很多开销,但是,如果您按照我向用户描述的那样嵌入您的文档 - >任务,您应该发现除了某些外部情况或批量更新外,您并不需要使用此功能。