java - 功能修改数据库时是否可以使用功能标志/切换?
问题描述
在考虑在应用程序中使用功能切换时,这个问题最让我困惑。大多数功能都需要对数据库进行一些更改。那么如何实现功能标志以在打开/关闭功能切换的同时顺利恢复数据库更改?特别是当使用某些数据库迁移工具时,例如 flyway 或 liquibase。
让我们举个例子。例如,我有带有 Id、Name 列的简单表播放列表。我想在应用程序中添加向播放列表添加描述的功能。数据库表需要更改。已添加新列。列值不是强制性的。到目前为止很简单。一段时间后,功能将从生产中关闭。解决方案非常简单但很混乱——我们可以将列保留在 db 中,不再在代码中使用它。迁移工具以增量方式工作,因此当我关闭功能切换(或者我错了吗?)时,我看不到任何返回到以前的数据库状态的选项。更难的例子是当字段需要是强制性的。然后我不能只将该字段留在数据库中。它将向后不兼容。那是什么?如何处理这种情况?我认为这是很常见的情况。
此外,即使对 db 稍作更改,我的该类的应用程序模型也会发生变化。(假设使用了一些 ORM)。这不像用策略模式替换实现那么容易。除非您为 ORM 模型的使用提供大量抽象。所以添加这样一个特征标志似乎很复杂。谁能帮我理解一下如何使用功能工具?或者也许有人有完整的例子来展示?首选Java
解决方案
功能切换是一种在不更改代码的情况下更改行为的方式——这意味着它们也与数据库模式更改无关。关闭切换应该做一些可逆的事情,比如从 UI 中隐藏一个字段,而不是像删除数据库列这样永久的事情。考虑到这一点,您的示例将如下所示:
- 播放列表的发货 v1
- 在 v2 中,为描述添加 UI,但被功能标志禁用。迁移数据库以添加新的描述列。船。
- 启用功能标志。用户现在可以使用描述
- 禁用功能标志。用户无法使用描述,但它仍在应用程序和数据库中
- 在 v3 中,移除休眠的 UI 元素和逻辑。迁移数据库以删除不需要的描述列。船。
推荐阅读
- javascript - 即使节点高于 8.5,performance.now() 也未定义
- c# - Unity c# - 将玩家移动到他面对的方向(而不是全局空间)
- python - Tensorflow Keras 保持每批次的损失
- python - Python - 如何通过请求向 API 发出 PATCH 请求
- r - 基于作为字符串的第一列在 R 中聚合数据框
- r - 将 R 中的多个列组合成一个新的向量列(最好是 tidyr 解决方案)
- python - python elasticsearch elasticsearch.exceptions.SSLError: ConnectionError([SSL: WRONG_VERSION_NUMBER] 版本号错误 (_ssl.c:1056))
- c++ - 如何使用户可以将变量添加到类并在 C++ 中选择类型?
- android - 即使可点击属性为真,FrameLayout onClick 事件也不会触发
- c++ - ofstreamFile << ifstreamFile.rdbuf() 失败,但文件中的文件文本正确写入 ofstreamFile