首页 > 解决方案 > 功能修改数据库时是否可以使用功能标志/切换?

问题描述

在考虑在应用程序中使用功能切换时,这个问题最让我困惑。大多数功能都需要对数据库进行一些更改。那么如何实现功能标志以在打开/关闭功能切换的同时顺利恢复数据库更改?特别是当使用某些数据库迁移工具时,例如 flyway 或 liquibase。

让我们举个例子。例如,我有带有 Id、Name 列的简单表播放列表。我想在应用程序中添加向播放列表添加描述的功能。数据库表需要更改。已添加新列。列值不是强制性的。到目前为止很简单。一段时间后,功能将从生产中关闭。解决方案非常简单但很混乱——我们可以将列保留在 db 中,不再在代码中使用它。迁移工具以增量方式工作,因此当我关闭功能切换(或者我错了吗?)时,我看不到任何返回到以前的数据库状态的选项。更难的例子是当字段需要是强制性的。然后我不能只将该字段留在数据库中。它将向后不兼容。那是什么?如何处理这种情况?我认为这是很常见的情况。

此外,即使对 db 稍作更改,我的该类的应用程序模型也会发生变化。(假设使用了一些 ORM)。这不像用策略模式替换实现那么容易。除非您为 ORM 模型的使用提供大量抽象。所以添加这样一个特征标志似乎很复杂。谁能帮我理解一下如何使用功能工具?或者也许有人有完整的例子来展示?首选Java

标签: javaliquibaseflywayfeaturetoggle

解决方案


功能切换是一种在不更改代码的情况下更改行为的方式——这意味着它们也与数据库模式更改无关。关闭切换应该做一些可逆的事情,比如从 UI 中隐藏一个字段,而不是像删除数据库列这样永久的事情。考虑到这一点,您的示例将如下所示:

  1. 播放列表的发货 v1
  2. 在 v2 中,为描述添加 UI,但被功能标志禁用。迁移数据库以添加新的描述列。船。
  3. 启用功能标志。用户现在可以使用描述
  4. 禁用功能标志。用户无法使用描述,但它仍在应用程序和数据库中
  5. 在 v3 中,移除休眠的 UI 元素和逻辑。迁移数据库以删除不需要的描述列。船。

推荐阅读