【问题标题】:How could db schemas, implemented by Liquibase, be extended?如何扩展由 Liquibase 实现的数据库模式?
【发布时间】:2013-12-23 08:52:16
【问题描述】:

我们有一个产品,我们希望使用 liquibase 来实现/重构 db 架构。然后需要在可能存在架构差异的生产站点级别进行扩展。站点架构可能彼此不同,即具有额外的站点特定表、额外的列等。

那么如何在站点级别扩展由 Liquibase 实现的 db 模式呢?即如何扩展 Liquibase 项目以便实施特定于站点的更改集?

附言我们通常有 Oracle 和 Postgres 解决方案。

【问题讨论】:

  • 这些网站定制是您事先知道的,还是网站随时添加而您无法预料?
  • 这些站点位于不同的司法管辖区,自然会有不可预见的变化,这些变化仅适用于一个站点,而不适用于其他站点。还有一些已知的模式差异可以满足站点特定的要求。换句话说,我们有一个产品级别的架构,它在站点级别进行扩展,以满足已知需求和站点未来的变化。

标签: java oracle postgresql liquibase


【解决方案1】:

除了@SteveDonie 所说的之外,还有另一种可能的解决方案或混合解决方案。在您的源代码结构中,您存储标准代码和自定义代码。然后,您可以使用 Liquibase 允许您使用的原始 sql 更改日志文件。

所以有一个类似这样的文件夹结构:

DbCode
      |
      |---Standard
                  |---Tables
                            |---employee.sql
                            |---sale.sql
                   |---Schemas
                              |---public.sql
      |---Site1
                  |---Tables
                            |---site1_specific_table.sql
                   |---Schemas
                              |---site1.sql
      |---Site2
                  |---Tables
                            |---site2_specific_table.sql
                   |---Schemas
                              |---site2.sql

在标准文件夹的根文件夹中放置 0_Main.xml。当您使用此文件运行 liquibase 时,它​​将为标准数据库构建创建升级。但是,如果我们添加自定义站点,我们将获得特定于该站点的升级。这将允许您在标准文件夹下存储常见的或我称之为标准的代码,并在给定站点文件夹下存储任何特定于站点的代码。所以我们将 0_Main.xml 放在 Site1 和 Site2 下。

C:\DbCode\Standard\0_Main.xml 看起来像这样:

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <includeAll  path="C:/ProjectX/Standard/Schemas"/>
    <includeAll  path="C:/ProjectX/Standard/Tables"/>
    <includeAll  path="C:/ProjectX/Standard/ForeignKeys"/>

</databaseChangeLog>

C:\DbCode\Site1\0_Main.xml 看起来像这样:

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <includeAll  path="C:/ProjectX/Standard/Schemas"/>
    <includeAll  path="C:/ProjectX/Standard/Tables"/>
    <includeAll  path="C:/ProjectX/Standard/ForeignKeys"/>

    <includeAll  path="C:/ProjectX/Site1/Schemas"/>
    <includeAll  path="C:/ProjectX/Site1/Tables"/>
    <includeAll  path="C:/ProjectX/Site1/ForeignKeys"/>

</databaseChangeLog> 

C:\DbCode\Site2\0_Main.xml 看起来像这样:

<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <includeAll  path="C:/ProjectX/Standard/Schemas"/>
    <includeAll  path="C:/ProjectX/Standard/Tables"/>
    <includeAll  path="C:/ProjectX/Standard/ForeignKeys"/>

    <includeAll  path="C:/ProjectX/Site2/Schemas"/>
    <includeAll  path="C:/ProjectX/Site2/Tables"/>
    <includeAll  path="C:/ProjectX/Site2/ForeignKeys"/>

</databaseChangeLog>

通过这些配置,您可以将代码构建为标准版本和/或 Site1 或 Site2 版本。

includeAll 标签告诉 liquibase 进入给定目录并获取所有脚本。因此,通过首先对 Standard 文件夹执行 includeAll,我们将所有标准对象添加到升级中,然后当我们针对它们的文件夹调用 includeAll 时所有站点特定脚本。

【讨论】:

  • 如果在这方面进行对话会有所帮助,请告诉我,我们可以想办法交谈。很难在不运行多个页面的文本帖子中解释所有细节和优点。我喜欢优化数据库构建,使其合乎逻辑且易于使用,并抓住机会谈论它。
  • 这也假设所有代码都经过构建过程。那是没有人登录数据库,只是在雷达之外部署代码。如果你的代码在雷达之外,我帮不了你。
  • 这很有意义。您的解决方案更适合我们的构建过程。我可以向您保证,没有任何代码不经过构建过程,无论如何都不应该是这种情况。
【解决方案2】:

Liquibase 具有“上下文”的概念,可用于描述特定于给定环境的更改。通常,这些用于开发环境、测试或登台环境等,但它们是完全通用的,也可以用于不同的站点。

以下是相关文档:http://www.liquibase.org/documentation/contexts.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多