在阅读了有关数据库架构迁移和版本的许多问题后,我想出了一个在更新过程中安全更新数据库架构的方案。基本思想是在更新期间,我们将数据库导出到文件,删除并重新创建所有表,然后重新导入所有表。没有什么太花哨或冒险。
问题是这个系统有点“病毒”,这意味着添加列或表是安全的,因为删除它们会在重新导入数据时引起问题。通常情况下,我会很好地忽略这些列,但问题是许多被删除的项目实际上已被重构,并且代码中旧的项目的出现欺骗了其他程序员认为他们可以使用它们。
所以,我想找到一种方法,可以将列或表标记为已弃用。在理想情况下,在更新模式时会标记已弃用的对象,但是在下次更新期间,我们的备份脚本将不会选择以这种方式标记的对象,从而允许我们最终淘汰模式的这些部分
我发现MySQL(也可能是其他数据库平台,但我们正在使用它)支持字段和表的COLUMN属性。这将是完美的,除了我无法弄清楚如何以有意义的方式实际使用它。我将如何编写SQL查询以获取 not 包含与包含“deprecated”一词的文本的注释匹配的所有列名?或者我看到这个问题都错了,错过了一个更好的方法来做到这一点?
答案 0 :(得分:7)
也许你应该重构对你的表使用视图,其中视图永远不包括去掉的列。
答案 1 :(得分:3)
“Deprecate”通常意味着(至少对我而言)某些内容在未来某个日期被标记为删除,新功能不应使用,并且会在现有代码中删除/更改。
我不知道一个很好的方法来“标记”一个已弃用的列,而不是重命名它,这很可能会破坏它!即使存在这样的设施,它真的会有多少用途?
那么你真的想弃用或删除吗?从你问题的内容来看,我猜测后者。
我有一种令人讨厌的感觉,你可能在其中一个“如果我想去那里,我不会从这里开始”的情况。但是,这里有一些想法可以浮现在脑海中:
阅读Recipes for Continuous Database Integration,它似乎解决了您的大部分问题
明确删除列。在MySQL 5.0中(甚至更早?),该工具作为DDL的一部分存在:请参阅ALTER TABLE语法。
看看ActiveRecord::Migration在Ruby中是如何工作的。迁移可以包括“remove_column”指令,该指令将以适合平台的方式处理问题。从个人经验来看,它肯定适用于MySQL。
针对导出运行脚本,以从INSERT语句(列和值列表)中删除该列。如果您的数据库相当小,可能非常可行,我猜测如果您按照描述导出并重新导入数据库,则必须如此。