我正在这里加速一些缓慢的操作,一个案例是表中的父子关系树。目前系统运行在 SQLServer 上,经过一番研究,我发现使用通用表表达式可以将多个查询压缩为一个。
到目前为止一切都很好,但是语法是特定于 SQLServer 的,并且使用(例如)Oracle 做同样的事情需要完全不同的语法。
可以做些什么来构建系统以允许将来适应其他 RDBMS?我主要担心的是:
- SQL 语句散布在代码中,一个 RDBMS 中的一条语句可能需要在另一个 RDBMS 中使用多个语句,因此甚至程序逻辑也可能需要更改。
- 即使可以很好地封装在一个 RDBMS 中的东西(我正在使用存储函数来隐藏 DB 中的一些复杂性)在不同的 DB 中也有细微的差异,或者根本不可用。
到目前为止,我觉得超出最简单 SQL 语句的所有内容似乎总是需要特定于供应商的扩展,因此不可能将差异整齐地隐藏在几个类/存储的 SQL 中(当然可以使用具有大部分抽象已经内置了。但这也排除了数据库的许多更有用的特性)。
有哪些策略可以至少缓解供应商差异带来的痛苦?我知道这是一个非常广泛的问题,没有万能的答案。但我希望有一些指针和模式来减少数据库对应用程序的影响。
编辑:实现语言是 Java,简单地使用 ORM(例如 Hibernate)不是我想要的(或多或少需要重写约 50% 的代码库)。
EDIT2:我主要寻找以尽可能普遍兼容的方式将细节推送到数据库中的可能性,理想情况下我希望java部分使用的SQL对于所有平台都是相同的(或者只需要非常由于语法差异而略有变化)。对于我给出的 CTE 示例,我目前将其推送到存储函数中,希望在需要移植时,该功能也可以在函数中重现。
EDIT3:目前我没有迫切需要支持其他 RDBM。如果它只适用于 SQLServer,没有人会责怪我。但在可能的情况下,我希望避免将 java 代码与特定的数据库供应商联系起来。
EDIT4:一些背景 - 当前的工作是向系统添加功能 - 它不是设计或计划的功能。业务人员的要求一点点滴滴出现,很难提前计划。虽然每个需求本身并不是很难解决,但恐怕我们会积累一大堆标记的东西,如果不详细了解每个查询,这些东西是不可能移植的。由于 SQLServer 本身在每个主要的新版本中也引入了各种与自身不兼容的问题,我担心即使切换到更新的 SQLServer 也可能成为未来的主要障碍(我们过去从 2005 年到 2008 年进行过一次这样的升级 - 那一次去了对于我正在维护的东西来说很顺利,但它已经给我们的供应商之一造成了许多问题)。