【问题标题】:How can I keep order of refactors using database refactoring software?如何使用数据库重构软件保持重构的顺序?
【发布时间】:2014-05-11 12:16:18
【问题描述】:

我一直在尝试使用LiquibaseDBDeploy。我更喜欢 Liquibase,因为它的非 SQL 接口(即我可以只使用 JSON 或 Yaml 变更集)。但是,这两个软件都有一个问题。

Liquibase 工作流程

  1. 我创建了一个主变更日志。它所做的只是includeAll 一个文件夹,其中包含带有小变更集的小文件。
  2. 然后我创建变更集,并在它们前面加上一个数字(例如时间戳或简单的整数,如 1、2 等)。

DBDeploy 工作流程

  1. 我刚开始制作 delta sql 文件,前缀与上面的数字 2 相同。

问题

嗯,这个问题太微不足道了,我觉得问它很愚蠢,但它就是这样。考虑这种情况:

  1. 我创建了一个分支来处理我的功能,比如向系统添加订单。
  2. 我的同事 Bob 创建了自己的分支来向系统添加产品。
  3. 当需要合并时,不知道谁的变更集或增量 sql 将首先运行。这可能会破坏数据库。

这不会发生在任何人身上吗?如果是这样,在 PHP 领域有什么解决方法?

谢谢。

【问题讨论】:

    标签: php liquibase refactoring-databases dbdeploy


    【解决方案1】:

    我使用了几个不同的迁移框架 - Liquibase、Rails 以及来自 C# 世界的名为 Tarantino 的东西。每个都使用类似的策略,将更改记录在单独的文件中。每个人都在一个小团队中(

    Rails 对文件的命名方式最为教条,也是我因分支而遇到最多冲突的地方。大多数冲突是基于名称的,而不是数据库中的逻辑冲突。

    在使用 Liquibase 的项目中,我们使用了主/包含模式,开发人员在分支上进行工作。因为文件名有一个 3 位数的序列号加上一个简短的描述(即 009-add-customer0index.xml),所以我们没有名称冲突。我们主要通过相互交谈来避免数据库级别的冲突——每日站会等。

    我们在使用 Tarantino 时也有类似的经历,尽管它只是使用一个充满文件的目录进行迁移。与 Liquibase 一样,我们采用了一种命名约定,使事情井井有条。即使两个变更集具有相同的编号,它们也会有不同的名称,而且在 99.9% 的情况下,这两个变更集的顺序并不相互依赖。

    仅对于一个数据点,使用 Tarantino 的项目通过大约 400 个变更集趋于平稳。

    【讨论】:

    • 主包含模式是什么意思?
    • 我指的是您在原始问题中提到的内容,即您“创建一个主变更日志。它所做的只是包含一个包含小文件的文件夹,其中包含小变更集。”
    【解决方案2】:

    (我只知道 liquibase - 所以我的回答只对 liquibase 有效)

    正如includeAll doc 所述,文件将按字母顺序运行。所以我希望您的编号应该足以使文件按正确的顺序排列。 但是,无论如何,您都必须在您和 Bob 之间同步这些数字,以找出必须首先运行的内容。

    我们不使用includeAll。我们手动将文件包含到主更改日志中。因此,任何想要更改数据库的人都必须注意将其包含在主更改日志中。如果有两个更改,最后出现的开发人员必须确保在主更改日志中的正确位置包含/合并他的更改。

    已编辑 - 解释我们使用的包含机制

    在开发过程中,我们只是不及格整个数据库,让 liquibase 在我们更改任何内容时从头开始创建数据库(在我们的开发数据库上)。 我们总是将变更集文件签入到我们的代码存储库中。因此,我们可以跟踪开发中所做的所有事情,因为我们可以检查变更集的每个版本并让 liquibase 使用它创建数据库。

    仅当我们正在开发的版本(或冲刺)完成时。然后我们真的让变更集运行,并让它们改变生产数据库。

    然后这个循环一次又一次地重复。

    这样,liquibase 只会跟踪最终的数据库更改,而不是在开发过程中可能发生的所有试验。

    在开发过程中,您最终可能会多次更改表格,因为您尝试了不同的东西。您添加了一列,然后意识到整个事情将无法正常工作,因此您再次删除该列并添加另一列。为什么要在 databasechangelog 中进行所有这些更改?然后它会充满不必要的东西——就像你害怕的那样。

    希望这可以解决问题。但最终你可能会有完全不同的开发方法。因此,请随意按照您需要的方式使用 liquibase。

    没有理由在开发过程中将所有想法都填满databasechangelog 表。只有当我们完成开发并发布一个版本时

    【讨论】:

    • 这不是让变更日志变得非常非常大吗?我们是一个敏捷团队,在第一个开发阶段有一个小项目,这意味着数据库将经历很多变化,有时甚至可能会进行少量重新设计。
    • @ParhamDoustdar 您不必跟踪开发阶段的每一个变化。我们以这种方式使用它:在开发过程中,您可以随意更改变更集。例如。您添加一个新表并在同一个“冲刺”中意识到它需要更多列,然后您将更改创建表的变更集。只有在 sprint 结束时,您才会将变更集视为已修复并发布正式版本(例如 0.1)。然后,如果同一个表需要更多列,那么从那时起,您将不得不创建一个新的变更集。您可以/应该在代码存储库中签入您的变更集文件...
    • 请确认我对您的理解正确。您的意思是包含所有变更集并将它们设置为在更改时运行。然后,我们无需创建不同的变更集,而是更改我们在此 sprint 中已经创建的变更集,然后开始创建版本。是对的吗?如果是这样,为什么我们需要创建发布?为什么不继续将变更集添加到单个变更日志中?是将变更日志分成更小、更易于管理的块吗?
    • 我已经扩展了我的答案,因为 cmets 只允许一定数量的字符......希望这可以解决问题。
    • 我还是迷路了。你说不手动修改数据库,让Liquibase进行修改。伟大的。但是,您说变更集要等到模式稳定后的发布结束时才会运行。这些似乎是相反的。您能否在答案中提及一个示例性的、更具体的工作流程?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多