然而,多文档事务(跨多个文档或集合)传统上并不支持完全的 ACID 保证。虽然 MongoDB 4.0 副本集和 4.2 分片集群中都支持多文档 ACID 事务,但与传统的关系事务相比,它们的性能特征和复杂性需要仔细考虑。对于具有高度复杂、多语句事务且需要强跨文档一致性的应用程序(例如,具有复杂连接和约束的传统银行账本),关系数据库可能仍然是更合适的选择。
读取一致性:默认情况下,MongoDB 提供平衡一致性和性能的“读取关注”级别。
当地的 (默认):返回主服务器或辅助服务器的数据没有保证新鲜度。速度最快,但可能会从辅助节点返回过时的数据,但对于非关键读取(例如用户个人资料或社交媒体信息)来说,这种做法尚可接受。
多数:读取操作会返回已被大多数副本集成员确认的数据,从而提供更强的一致性,但延迟较高。这适用于需要确保数据持久化的读取操作。
线性化:最强的读取关注点,写入操作写入的所有数据。延 匈牙利电话营销数据 迟最高,适用于需要最强一致性模型的场景(例如,顺序一致性至关重要的金融交易)。
数据建模复杂性:虽然无模式提供了灵活性,但如果管理不当,可能会导致“无模式”混乱。周到的数据建模对于避免非规范化陷阱、确保查询效率和防止数据不一致仍然至关重要。决定何时嵌入数据,何时引用数据(并可能使用$查找) 是一个关键的设计决策。过度嵌入会导致文档过大,更新效率低下,而过度引用会导致过多的$查找 运营。
连接:MongoDB 没有原生的类似 SQL加入针对高度规范化的数据模型进行了优化的操作。虽然聚合框架的$查找stage 提供了类似连接的功能,但对于分布在多个集合中的高度规范化数据,其效率通常低于关系连接。这更加强调了对数据建模的周全性,通常涉及非规范化或嵌入,以最大限度地减少连接的需求。
非规范化:文档模型通常鼓励非规范化,以优化读取性能并减少连接操作。虽然这样做有益,但它可能会导致跨文档的数据重复。维护这些重复字段的一致性需要谨慎的应用程序级逻辑或特定的更新操作($设置,$取消设置) 可能跨越多个文档,这会增加复杂性。
存储开销:与高度规范化的关系模式相比,嵌入式文档和非规范化有时会导致文档大小更大,存储占用空间增加,因为数据可能会重复。
锁定:MongoDB 使用各种锁定机制(例如,文档级锁定、集合级锁定、数据库级锁定(取决于操作和版本))来确保写入期间的数据一致性。虽然通常情况下效率较高,但大型更新操作或特定工作负载可能会发生争用,从而导致性能瓶颈。了解这些锁定行为对于优化写入密集型应用程序至关重要。
学习曲线:习惯于 SQL 和关系模型的开发人员需要适应 MongoDB 的文档模型、查询语言和操作范例。