文档数据库通过灵活的数据模型处理模式变更,这些数据模型不强制执行严格的结构。 与关系数据库不同,关系数据库需要预定义的模式和迁移才能更改表,文档数据库(如 MongoDB 或 CouchDB)允许每个文档拥有自己的字段集。 当需要模式更改(例如添加新字段)时,开发人员只需开始编写具有更新结构的文档即可。 除非显式修改,否则现有文档保持不变。 例如,向用户配置文件添加“middleName”字段的应用程序可以将新字段写入新文档,而旧条目继续不使用它。 应用程序通过检查“middleName”是否存在并在缺少时使用默认值(如空字符串)来处理兼容性。 这种方法避免了停机时间,并让团队可以在没有数据库级别约束的情况下进行迭代。
为了管理更复杂的更改,例如重命名字段或更改数据类型,应用程序通常采用渐进式迁移策略。 例如,将“userAge”字段重命名为“age”可能涉及暂时写入这两个字段。 应用程序可以分批处理现有文档以更新字段名称,或在数据检索期间处理转换。 一些团队在文档中嵌入模式版本号来跟踪更改。 读取数据时,应用程序会检查版本并根据需要应用转换。 例如,可以将具有“userAge”的 1 版文档即时转换为 2 版的“age”。 这样可以实现向后兼容性,并将迁移工作分摊到一段时间内。 索引可能也需要调整——向新字段添加索引需要单独创建,但现有索引在删除之前仍然有效。
虽然文档数据库优先考虑灵活性,但有些数据库提供可选的模式验证以实现一致性。 例如,MongoDB 允许定义 JSON 模式以强制执行对新文档的规则,例如要求特定字段或数据类型。 可以更新这些规则,而不会中断现有数据。 例如,电子商务应用程序可能会强制新的“order”文档包含“discountCode”字段(该字段可以为空)。 但是,此验证是可选的,允许团队在结构和敏捷性之间取得平衡。 开发人员仍然必须在代码中处理混合数据——例如,解析存储为旧文档中的字符串的地址与新文档中的对象。 通过结合动态模式、渐进式迁移和可选验证,文档数据库简化了模式更改,同时让应用程序可以按照自己的节奏管理复杂性。