好的,这就是我们面临的问题。
目前:
我们正在努力实施的目标:
我们遇到的问题是如何不仅使用应用程序而且还使用数据库实现此迁移。
我们目前的解决方案是:
但是在我们讨论这个过程时,我们正在考虑两次重写New Web Service。一次用于旧数据结构,一次用于新数据结构,目前我们无法代表旧数据结构以适应新Web服务的新数据结构。
我想知道是否有人遇到过这样的挑战,你是如何克服这些类型的问题/实施等的。
答案 0 :(得分:19)
编辑:使用双向触发器进行更多同步说明;语法,语言和清晰度的更新。
我在我工作了7年的大型Web应用程序上的数据模型升级方面遇到了类似的问题,所以我感到很痛苦。根据这一经验,我会提出一些不同的东西 - 但希望能够更容易实现。但首先,观察一下:
组织的价值在于数据 - 数据将比您当前的所有应用程序都长。该企业将不断发明新的方法,从其捕获的数据中获取价值,从而产生新的报告,应用程序和开展业务的方式。
因此,正确掌握新数据结构应该是您最重要的目标。不要交易使结构与其他短期发展目标相对立,尤其是:
此结构将随着时间的推移而发生变化,因此您的体系结构必须允许频繁添加和不频繁的规范化。这意味着您的数据结构及其任何共享API(包括RESTful服务)必须正确版本化。
您提到您的意愿"将所有功能移至RESTful服务,因此没有应用程序可以直接访问数据库"。我需要就遗留应用程序提出一个非常重要的问题:为什么这很重要,它带来了什么价值?
我问因为:
其他贯穿各领域的问题没有改变:
您可以通过维护旧版RESTful API来迁移数据库并使旧版应用程序保持运行。但是,如果我们可以保留旧版应用而不引入“遗产”' RESTful服务。
大概是'遗产'应用程序使用SQL直接访问数据表;你也可能有很多数据库视图。
数据迁移的一种方法是新数据库(在新模式中使用新的规范化结构)将旧结构作为视图呈现给遗留应用程序,通常来自不同的模式。
这实际上很容易实现,但只解决报告和只读功能。遗留应用程序DML怎么样? DML可以使用
解决使用触发器对新格式表进行双向同步的遗留格式表是一种蛮力的解决方案并且相对难看。
您最终会在两个不同的模式(或数据库)中使用相同的数据,并且如果同步代码存在错误,则数据可能会失去同步 - 然后您就会遇到"两个主数据的经典问题#34;问题。因此,将此视为最后的手段,例如:
当您的数据需要进行此类更改时,代码和逻辑某处会发生一些重大更改。您可以在兼容性层中实现(优点:不更改遗留代码)或更改遗留应用程序(优点:数据层干净)。这是工程团队的技术决策。
使用上面概述的方法创建遗留结构的兼容性数据库可以最大限度地减少对遗留应用程序的更改(在某些情况下,遗留应用程序可以继续进行而不会发生任何代码更改)这大大降低了开发和测试成本(业务没有净功能增益),并大大降低了部署风险。
它还可以让您专注于组织的真正价值:
请不要将上述内容视为针对Web服务的诽谤,尤其是RESTful Web服务。当出于正确的原因使用时,例如启用Web应用程序或在不同系统之间进行集成,这是一个很好的架构解决方案。但是,它可能不是在数据迁移期间管理旧应用程序的最佳解决方案。
答案 1 :(得分:2)
您应该做的是定义一个新的数据模型(“规范化”)并构建从规范化模型到遗留模型的映射。然后,您可以随意使用规范化的呼叫替换传统的直接呼叫。这打破了没有代码。
同时,您需要定义(cerntralized)遗留数据库API的数量,并将其映射到规范化模型。现在,您可以随意使用旧版db API上的调用替换原始的旧版db调用。这没有打破代码。
完全替换原始调用后,您可以将数据模型切换到实际标准化调用。这应该不会破坏任何代码,因为现在一切都是针对遗留的db API或规范化的db API。
最后,您可以使用使用规范化数据API的修订代码替换旧版db API调用和相关代码。这需要仔细重新编码。
要加快这一切,您需要一个自动代码转换工具来实现代码替换。
本文档似乎有一个很好的概述:http://se-pubs.dbs.uni-leipzig.de/files/Cleve2006CotransformationsinDatabaseApplicationsEvolution.pdf
答案 2 :(得分:1)
首先,这似乎是一个非常混乱的情况,我不认为有一个“干净”的解决方案。我经历了几次类似的情况 - 他们并不是很有趣。
首先,更改客户端应用程序的工作将会非常重要 - 例如,如果基础域发生更改(例如,通过引入与人员分离的地址的概念),客户端应用程序也会发生变化 - 这不是只是改变了访问数据的方式。避免这种痛苦的最好方法是编写API层以反映未来的业务领域模型,并将旧的数据库模式粘合到其中;如果有新概念无法使用旧数据反映(例如“get / app / addresses / addressID”),则抛出NotImplemented错误。如果您可以使用旧数据反映新模型,请尽可能将其连接在一起,然后重新考虑因素。
其次,这意味着您需要在API中构建版本作为一流的关注点 - 因此您可以告诉客户端在版本1中,功能x,y和z会抛出“NotImplemented”异常。每个版本都应向后兼容,但添加新功能。这样,只要您不破坏服务,就可以在版本1中重构功能,并在版本1.1中实现功能x,在版本1.2中实现功能y等。理想情况下,为您的版本制定路线图,并通知客户端应用程序所有者如果您要停止支持某个版本,或者发布重大变更。
第三,对API进行一系列自动化集成测试是您可以做出的最佳投资 - 他们确认您在重构时没有破坏功能。
希望这有一些用处 - 我认为对你的问题没有一个直截了当的答案。