数据一致性
MongoDB 允许您根据应用需求选择规范化或复制数据以优化应用。如果您的模式中存在数据复制,您必须决定如何使多个集合中的复制数据保持一致。一些应用要求立即使复制数据一致,而其他应用可以容忍读取陈旧数据。
使用案例
在您的应用中强制执行数据一致性有多种方法
方法 | 描述 | 性能影响 | 使用案例 |
---|---|---|---|
多个集合的更新在一个原子操作中发生。 | 可能很高,由于读取竞争 | 您的应用必须始终返回最新的数据,并且可以在读取密集期间容忍潜在的性能负面影响。 | |
修改应用模式,在单个集合中嵌入相关数据。 | 低到中等,取决于文档大小和索引 | 您的应用始终同时读取和更新相关数据。此方案简化了您的模式,并防止了对 $lookup 操作的依赖。 | |
当一个集合发生更新时,触发器会自动更新另一个集合。 | 低到中等,存在处理触发事件的潜在延迟 | 您的应用可以容忍读取略微陈旧的数据。如果用户在更新后立即运行查询,但在触发器完成更新第二个集合之前,他们可能会看到过时的数据。 |
强制执行数据一致性的最佳方式取决于您的应用。要了解更多关于每种方法的优点和实现细节,请参阅相应的文档页面。
任务
为了确保您应用程序中的数据一致性,请参阅以下页面
详情
以下因素会影响您如何确保数据一致性。
数据陈旧
考虑应用程序返回最新数据的重要性。有些应用程序可以返回几分钟或几小时陈旧的数据,而不会对用户造成影响。
例如,在电子商务应用程序中,用户需要立即知道商品是否可用。这些信息最好尽可能保持一致,即使需要频繁更新。
相比之下,分析查询通常预期读取略微陈旧的数据。保持分析数据完全一致并不重要。
您的应用程序对陈旧数据的容忍度会影响如何最佳地保持数据一致性。在多个集合中频繁更新数据可以降低用户读取陈旧数据的风险。然而,频繁更新可能会对您的应用程序性能产生负面影响。在确保数据一致性的同时,平衡用户需求和性能影响。
参照完整性
参照完整性确保当删除一个对象时,该对象的所有引用也将被删除。
例如,一个应用程序有一个包含对 products
集合引用的 warehouse
集合。当从 products
集合中删除一个产品时,在 warehouse
集合中相应的引用也应该被删除。
如果你的模式需要参照完整性,将逻辑应用到你的应用程序中以确保引用的一致性。至少,你的应用程序逻辑应防止尝试查询不存在的引用时发生错误。