代码之家  ›  专栏  ›  技术社区  ›  Nik Reiman

在数据库模式中弃用列的最佳方法是什么?

  •  15
  • Nik Reiman  · 技术社区  · 16 年前

    在阅读了这里关于DB模式迁移和版本的许多问题后,我提出了一个在更新过程中安全更新DB模式的方案。基本思想是,在更新过程中,我们将数据库导出到文件,删除并重新创建所有表,然后重新导入所有内容。那里没有太花哨或太冒险的东西。

    问题是这个系统有点“病毒性”,这意味着它只对 添加

    因此,我想找到一种方法,将列或表标记为已弃用。在理想情况下,更新模式时会标记已弃用的对象,但在下次更新时,我们的备份脚本将不会选择以这种方式标记的对象,从而允许我们最终逐步淘汰模式的这些部分。

    我发现MySQL(可能还有其他DB平台,但这是我们正在使用的平台)支持字段和表的COLUMN属性。这将是完美的,除了我不知道如何以有意义的方式实际使用它。我该如何编写一个SQL查询来获取所有列名 是否包含与包含“弃用”一词的文本匹配的注释?还是我对这个问题的看法完全错误,错过了一个更好的方法?

    2 回复  |  直到 16 年前
        1
  •  7
  •   MrTelly    16 年前

    也许你应该重构以使用表上的视图,其中视图永远不包括去序列化的列。

        2
  •  3
  •   Mike Woodhouse    16 年前

    Deprecate “通常意味着(至少对我来说)某些东西被标记为在未来某个日期删除,不应该被新功能使用,并且将在现有代码中删除/更改。

    我有一种不祥的预感,你可能会陷入“如果我想去那里,我就不会从这里开始”的境地。然而,这里有一些想法浮现在脑海中:

    1. 阅读 Recipes for Continuous Database Integration

    2. 明确删除该列。在MySQL 5.0(甚至更早?)中,该功能作为DDL的一部分存在:请参阅 ALTER TABLE 语法。

    3. 看看如何 ActiveRecord::Migration 在Ruby中工作。迁移可以包括“remove_column”指令,该指令将以适合平台的方式处理问题。从个人经验来看,它肯定适用于MySQL。

    4. 对导出运行一个脚本,从INSERT语句中删除该列,包括列和值列表。如果你的数据库相当小,这可能是相当可行的,我猜如果你按照描述导出和重新导入它,它一定是可行的。