我的目标之一是要能够部署一个新版本的网运行的应用程序的旧版本。美中不足的是这一切都共用一个数据库。一个数据库,在新的版本往往包括显着的重构数据库的数据表。我想要推出新版本的应用程序的用户随时间的,并能够开关他们回到旧的版本,如果我需要。

奥伦有一个很好的 设置这一问题,但它结束:

"我们仍然在有些浑水有关部署到生产方面变化,影响到整个系统,机智,打破了数据库的变化。我要讨论在未来分期付款,这其中只有一点点出手,我很害怕。"

在随后永远不会来了;-).你会如何去关于管理移徙的破坏数据库变为一个共享的数据库旧版本相同的应用程序。你会怎么保持的数据同步吗?

有帮助吗?

解决方案

如果必须维护旧版本,则更改根本无法破坏。这也有助于部署新版本的Web应用程序 - 如果您需要回滚,如果您可以保留数据库,那么真的会有所帮助。

显然,这会带来重大的架构障碍,你几乎可以肯定最终得到一个显示其血统的数据库,可以这么说 - 但根据我的经验,部署的好处通常值得头痛。

如果您为所涉及的每个旧版本提供了一系列完整的集成测试,这会有所帮助。对于仍被视为“可能存在”的每个版本,您应该能够针对迁移的测试数据库运行它们。 - 很可能是“每个版本”。在某些情况下。如果您能够合理地严格控制部署,那么您可能只能兼容三个或四个版本 - 在这种情况下,您可以计划在有实际需要的情况下逐步淘汰过时的表/列等。请记住这种计划的复杂性与产生的利益。

其他提示

阅读斯科特*安布勒的书"重构数据库";带着一撮的盐,但也有很多很好的想法在那里。

细节可用的解决方案取决于DBMS使用。但是,你可以做的事情,如:

  • 创建一个新表格(或几个新的表格),用于新的设计
  • 创建一个图用老的表姓名,收集的数据的新台(s)
  • 创建'代替'触发器上看到更新的新表格代替景

在某些情况下,你不需要一个新的表你可能只需要触发器。

假设您的客户端只有2个版本,我只会在新表中保留一份数据副本。

您可以在新表格之上维护视图后面的新旧应用程序之间的合约。 使用before /而不是触发器来处理写入“old”的内容。实际写入新表的视图。

您正在维护2个版本的代码,但仍然必须开发旧的应用程序,但这是不可避免的。

这样,没有同步问题,实际上你必须处理“旧”之间的复制冲突。和“新的”模式。

如上所述,超过2个版本变得复杂......

首先,我想说这个问题很难,你可能找不到完整的答案。

最近我参与了维护传统的业务线应用程序,这可能很快就会演变为新版本。维护包括解决错误,优化旧代码和新功能,有时无法轻松适应当前的应用程序架构。我们的应用程序的主要问题是它没有很好的文档记录,没有任何变化的痕迹,我们基本上是第五个轮换团队在这个项目上工作(我们相当新)。

将外部细节放在一边(代码,图层等),我将尝试解释一下我们当前如何管理数据库更改。

我们现在有两条规则要遵循:

  1. 首先,旧的代码(sql,存储过程,函数等)是按原样运行的,应该按原样保存,除非有大小写(错误或功能更改),并且当然,尽可能多地记录它(尤其是像以下问题: “WTF!,为什么他这样做而不是那样?”。

  2. 其次,每个新功能都应该使用目前已知的最佳实践,并尽可能少地修改旧的数据库结构。这将引入一些数据库重构选项,例如在旧结构之上使用可编辑视图,为现有结构引入新扩展表,规范化结构并通过视图提供旧结构等。

  3. 此外,我们正在努力编写尽可能多的单元测试,因为业务分析师正在协同工作并记录业务规则。

    数据库重构是一个非常复杂的领域,需要简短的回答。有很多书可以解决您的所有问题,一个http://databaserefactoring.com/ 被指向一个答案

    后来编辑:希望第二条规则也能回答破坏变化的处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top