代码之家  ›  专栏  ›  技术社区  ›  ablerman

django和mongodb是否让迁移成为过去?

  •  15
  • ablerman  · 技术社区  · 14 年前

    3 回复  |  直到 12 年前
        1
  •  16
  •   Gates VP    13 年前

    我认为这是一个非常好的问题,但是基于您正在使用的libs和您对“迁移”的期望,答案会有点分散。

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

    • 添加字段:
    • 从理论上讲,你实际上并没有和你的模式联系在一起,所以这里的“删除”是相对的。如果删除“属性”并且不再加载该字段,那么该字段是否在数据中并不重要。所以如果你 不要 关心“清理”数据库,那么删除字段不会影响数据库。如果你 如果要清理数据库,基本上需要对数据库运行一个巨型for循环。

    一些皱纹

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

    在典型的RDBMS中,字段名的“大小”实际上并不相关。然而,在Mongo中,字段名实际上占用了数据空间,这在性能方面有很大的不同。

    现在,如果您正在使用某种形式的“数据对象”,比如ActiveRecord,那么为什么要尝试在数据中存储完整的字段名呢?DB可能应该按照字母顺序存储所有字段,并在对象端使用一个映射。因此,一个文档可以有8个字段/属性,DB名称将是“a”、“b”…“j”,但是对象名称将是可读的,比如“Name”、“Price”、“Quantity”。

    我之所以提起这个问题,是因为它给我们的生活又添了一道皱纹 修改字段名 . 如果要实现映射,那么修改字段名实际上根本不会导致迁移。

    更多皱纹

    如果您想在删除上实现迁移,那么您必须这样做 之后

    Mongo预先分配空间,除非你做DB修复,否则它不会真正“把它还给”你。因此,如果删除文档上的一组字段,这些文档仍会占用磁盘上的相同空间。如果以后移动文档,则可以回收空间,但文档仅在增长时移动。

    如果从大量文档中删除了一个较大的字段,则需要进行修复或签出新文档 compact

        2
  •  2
  •   Mikhail Korobov    14 年前

    没有银弹。在非关系数据库中添加或删除字段更容易(只是不要使用不需要的字段或使用新字段),在传统数据库中重命名字段更容易(在无模式数据库中重命名字段时,通常需要更改大量数据),根据任务的不同,数据迁移是正常的。

        3
  •  1
  •   Thilo    14 年前

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

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

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

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