由于MongoDB没有模式,这是否意味着当我们更改模型时不需要进行迁移?
在非关系数据库中,迁移过程是什么样子的?
我认为这是一个非常好的问题,但回答会基于你使用的库和对“迁移”的期望而有所分散。
让我们看一下一些常见的迁移操作:
一些注意事项
然而,在ActiveRecord对象与字段名称结合的概念有点偏颇。ActiveRecord对象实际上提供了将对象属性映射到实际数据库字段的映射。
在典型的关系型数据库管理系统(RDBMS)中,字段名的“大小”并不重要。但是,在Mongo中,字段名实际上占用数据空间,这在性能方面有很大的影响。
现在,如果您使用某种形式的“数据对象”,比如ActiveRecord,为什么您会尝试将完整的字段名称存储在数据中呢?DB应该将所有字段按字母顺序存储,并在Object一侧提供一个映射。因此,一个文档可以有8个字段/属性,而DB名称将是“a”,“b”...“j”,但Object名称将是可读的内容,如“名称”,“价格”,“数量”。
我提到这个问题是因为它给修改字段名称增加了另一个难点。如果你正在实现一个映射,那么修改字段名称实际上并不会导致迁移。
更多注意事项
如果您想在删除时执行迁移,那么必须在部署之后进行。您还需要认识到,这样做并不会节省当前的磁盘空间。
Mongo预分配空间,除非进行数据库修复,否则实际上不会“归还”该空间。因此,如果您删除了一些文档中的字段,这些文档仍然占用相同的磁盘空间。如果以后移动文档,则可能会重新获取空间,但是只有当文档增长时才会移动文档。
如果您从许多文档中删除大型字段,则应进行修复或查看新的原地compact
命令。
没有万能的解决方案。在非关系型数据库中,添加或删除字段更容易(只需不使用不需要的字段或使用新字段),而在传统数据库中重命名字段更容易(通常需要在无模式数据库中更改大量数据)。数据迁移取决于任务,两种类型的数据库都可以胜任。