首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB -自动维护数据完整性

MongoDB -自动维护数据完整性
EN

Stack Overflow用户
提问于 2011-01-26 05:46:59
回答 2查看 4.4K关注 0票数 3

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

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

代码语言:javascript
复制
User: { _id: "...", userName: "johndoe", displayName: "John Doe", TotalTasks: 3 }

然后是任务文档..。

代码语言:javascript
复制
Task: { _id "...", title: "Finish Reports", userID: "...", userName: "johndoe", userDiplayName: "John Doe" }

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-26 06:00:09

您不能在服务器端强制执行这些约束。然而,触发器是planned的东西。当前支持的唯一约束是唯一索引。

票数 4
EN

Stack Overflow用户

发布于 2011-01-27 00:47:25

在没有外部应用程序编码的情况下,无法在MongoDB中强制执行它们。上面我会问的一个问题是,为什么不让任务成为用户文档的一部分?这将消除您的一致性问题,因为您将能够自动处理用户和任务。

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

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

但是,如果像我在user ->任务中描述的那样嵌入文档,您会发现除了在某些外部情况下或批量更新之外,实际上并不需要使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4799227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档