假设您有一个大型应用程序,其数据访问层绑定到 SQL 您想要提供其他非 sql DAL,例如 GoogleAppEngine 实例或基于 XML 的备份。您将如何处理这种迁移到不同的存储范例但灵活性有限,因为它是遗留的。
我可能在这里遗漏了信息,但我想到的一个解决方案是首先将当前的旧 DAL 重写为标准 API 库,例如 JDO;从那里开始,根据特定技术的学习曲线,与任何存储接口连接都只是时间问题。
与或非?
假设您有一个大型应用程序,其数据访问层绑定到 SQL 您想要提供其他非 sql DAL,例如 GoogleAppEngine 实例或基于 XML 的备份。您将如何处理这种迁移到不同的存储范例但灵活性有限,因为它是遗留的。
我可能在这里遗漏了信息,但我想到的一个解决方案是首先将当前的旧 DAL 重写为标准 API 库,例如 JDO;从那里开始,根据特定技术的学习曲线,与任何存储接口连接都只是时间问题。
与或非?
事实上,GAE/J 确实有一个有限的 JDO API;他们对 JDO 命名的使用具有误导性...... :(
另一方面,正如您所建议的那样,JDO 确实支持连接,作为注释和/或元数据,之后可以使用 JDOQL 查询进行检索。
如果我错了,请纠正我,但 JDO\JDOQL 感觉不如 SQL 查询强大。SQL 的强大之处在于能够即时连接大量相关表。我仍然无法从我的 web 应用程序中看到如何支持像这个简单示例这样的查询。
(人)模式:一个产品线有许多目录,其中有许多产品,任何发票都有这些产品中的任何一个
SELECT a.id, a.name, b.id, b.name, c.id, c.name from products a
left join catalog b on b.id = a.fk_catalog_id
left join productline c on c.id = b.fk_productline_id
where a.id in (select distinct product_id from invoice_product where invoice_id = <PARAM> )
GAE/J 为 BigTable 使用的 DataNucleus 也支持 XML 的持久性……使用 JDO。因此,支持持久性也是微不足道的。您在 GAE/J 中的加入能力有限......不是 JDO 的限制,只是他们如何在 GAE/J 插件中实现这样的事情。
——安迪(数据核)
理论上,正如您也提到的,您只需要使用一些标准接口,如 JPA,并更改其背后的实现或存储。不幸的是,在实践中这并不顺利。这是可以做到的,但你肯定会花一些时间在你没想到的问题上。
我将从稳定服务接口开始,然后逐个迁移它们。从最简单的开始,它足够小并且与系统的其他部分分开。
但是,作为第一步,重写代码以使用某些标准接口并不是一个坏主意。众所周知, JDO可以更好地处理非关系数据库,因此您可能会从选择它中受益。
至于Google App Engine,如果您已经在设计时考虑到了 RDBMS,您很可能需要完全更改您的数据模型。仅提及一些约束,没有 JOIN,您也不能在查询中使用 OR。因此,我建议您在进入一些大型迁移项目之前先进行试验。
很大程度上取决于具体细节,但根据您的描述,我可能会首先使用 DAO 构建一个数据访问层,该层明确定义了当前存储的接口和实现。
一旦启动并运行,您就可以开始创建新存储的接口实现并逐步迁移。