数据一致性
MongoDB 可以让您可以灵活地标准化或重复数据,以优化您的应用程序。如果您在模式中重复数据,那么您必须决定如何在多个集合中保持重复数据的一致性。一些应用程序需要立即使重复的数据保持一致,而其他应用程序可以容忍读取过时数据。
用例
有多种方法可以在您的应用程序中强制执行数据一致性:
方法 | 说明 | 性能影响 | 用例(Use Case) |
---|---|---|---|
对多个集合的更新发生在单个原子操作中。 | 由于读取争用,可能很高 | 您的应用程序必须始终返回最新的数据,并且能够容忍读取量大时可能产生的负面性能影响。 | |
修改应用程序模式以将相关数据嵌入到单个集合中。 | 低到中等,具体取决于文档大小和索引 | 您的应用程序始终会同时读取和更新相关数据。 此解决方案简化了模式,无需执行 $lookup 操作。 | |
当一个集合中发生更新时,触发器会自动更新另一个集合。 | 低到中,处理触发事件时可能会有延迟 | 您的应用程序可以容忍读取稍微陈旧的数据。如果用户在更新之后、触发器完成第二个集合更新之前立即运行查询,则可能会看到过时的数据。 |
实施数据一致性的最佳方法取决于您的应用程序。要详细了解每种方法的优点和实施,请参阅相应的文档页面。
任务
要在应用程序中实施数据一致性,请参阅以下页面:
详情
以下因素可能会影响实施数据一致性的方式。
数据过时
考虑应用程序返回最新数据的重要性。某些应用程序可以返回几分钟或几小时的过时数据,并且对用户不会产生影响。
例如,在电子商务应用程序中,用户需要立即知道某件商品是否有货。理想情况下,即使需要经常更新,这些信息也最好尽可能保持一致。
相比之下,分析查询通常会读取稍微过时的数据。保持分析数据的完全一致性并不重要。
对于应用程序而言,能容忍多久之前的数据视为合适可以影响数据一致性的最佳管理方式频繁更新多个集合中的数据可降低用户读取过时数据的风险。但是,频繁更新可能会对应用程序的性能产生负面影响。在执行数据一致性时,请在用户需求与性能影响之间取得平衡。
参照完整性
引用完整性确保当删除一个对象时,对该对象的所有引用也将被删除。
例如,某个应用程序具有一个 products
集合和一个 warehouse
集合,其中包含对 products
集合的引用。从 products
集合中删除产品时,也应删除 warehouse
集合中的相应引用。
如果您的模式需要引用完整性,请将逻辑合并到您的应用程序中以保持引用的一致性。至少,您的应用程序逻辑应防止在尝试查询不存在的引用时出错。