django与mongodb一起使迁移成为过去吗?

时间:2010-08-30 22:01:50

标签: python django mongodb

由于mongo没有架构,这是否意味着我们在更改模型时不必进行迁移?

使用非关系数据库迁移过程是什么样的?

3 个答案:

答案 0 :(得分:14)

我认为这是一个非常好的问题,但根据您使用的库以及您对“迁移”的期望,答案会有点分散。

我们来看看一些常见的迁移操作:

  • 添加字段:Mongo让这很容易。只需添加一个字段就可以了。
  • 删除字段:理论上,您实际上并不依赖于您的架构,因此这里的“删除”是相对的。如果删除“属性”并且不再加载该字段,那么该字段是否在数据中并不重要。因此,如果您关心“清理”数据库,那么删除字段不会影响数据库。如果你关心清理数据库,你基本上需要针对数据库运行一个巨大的for循环。
  • 修改字段名称:这也是一个难题。当您重命名字段“where”时,您是否重命名它?如果您希望数据库反映新的字段名称,那么您基本上必须在数据库上执行巨型for循环。为了安全起见,您可能需要“添加”数据,然后推送代码,然后“取消设置”旧字段。

一些皱纹

然而,与ActiveRecord对象串联的字段名称的概念只是有点偏斜。 ActiveRecord对象有效地提供了对象属性到实际数据库字段的映射。

在典型的RDBMS中,字段名称的“大小”并不真正相关。但是,在Mongo中,字段名称实际上占用了数据空间,这在性能方面产生了很大的不同。

现在,如果您使用某种形式的“数据对象”,如ActiveRecord,为什么要尝试在数据中存储完整的字段名称? DB可能应该按字母顺序存储所有字段,并在Object端显示地图。因此,一个Document可以有8个字段/属性,DB名称可以是“a”,“b”......“j”,但是Object名称可以是“Name”,“Price”,“Quantity”等可读字符。

我提出这个问题的原因是它为修改字段名称增加了另一个皱纹。如果您正在实现映射,那么修改字段名称根本不会导致迁移。

更多皱纹

如果你想要在删除时实现迁移,那么在部署之后你必须 。您还必须认识到在执行此操作时不会保存任何当前磁盘空间。

Mongo预先分配空间,除非你进行数据库修复,否则它不会真正“退回”。因此,如果删除文档上的一堆字段,那些文档仍会占用磁盘上的相同空间。如果稍后移动文档,则可以回收空间,但文档只有在成长时才会移动。

如果从大量文档中删除大字段,则需要进行修复或检查新的就地compact命令。

答案 1 :(得分:1)

没有银弹。使用非关系数据库更容易添加或删除字段(只是不使用不需要的字段或使用新字段),使用传统数据库重命名字段(在字段重命名时通常需要更改大量数据)在无架构数据库中),数据迁移是平等的 - 取决于任务。

答案 2 :(得分:1)

  

使用非关系数据库迁移过程是什么样的?

取决于您是否需要更新所有现有数据。

在许多情况下,您可能不需要触摸旧数据,例如添加新的可选字段时。如果该字段也具有默认值,则如果应用程序可以正确处理缺少的字段,则可能也不需要更新旧文档。但是,如果要在新字段上构建索引以便能够搜索/过滤/排序,则需要将默认值添加回旧文档中。

类似于字段重命名(在关系数据库中是微不足道的,因为您只需要更新目录而不是触摸任何数据),这是MongoDB中的一项重要任务(您需要重写所有文档)。

如果需要更新现有数据,通常必须编写一个迭代所有文档的迁移函数并逐个更新(尽管此过程可以共享并并行运行)。对于大型数据集,这可能会花费大量时间(和空间),并且您可能会错过事务(如果最终导致崩溃的迁移中途完成)。