当我看到所有这些生成数据库抽象层的 SQL 和所有那些 ORM 时,我开始感觉自己过时了,尽管我还远未老。我理解对它们的需求,但它们的使用扩展到了它们通常不属于的地方。
我坚信,使用数据库抽象层生成 SQL 并不是编写应在多个数据库引擎上运行的数据库应用程序的正确方法,尤其是当您使用 Oracle 等非常昂贵的数据库时。这或多或少是全局性的,它不仅仅适用于几种语言。
只是一个简单的例子,使用查询分页和插入:当使用 Oracle 时,可以使用 FIRST_ROWS 和 APPEND 提示(在适当的情况下)。在高级示例中,我可以提到在数据库中放入大量有意义的存储过程/包。对于每个 RDBMS,这些都是不同的。
仅使用许多 RDBMS 通常可用的一组有限功能,就无法利用那些昂贵且先进的数据库引擎必须提供的可能性。
那么回到问题的核心:如何开发应在多个数据库引擎上运行的 PHP、Python、Ruby 等应用程序?
我特别有兴趣了解您如何分离/使用专门为在单个 RDBMS 上运行而编写的查询。假设您有一个语句应该在 3 个 RDBMS 上运行:Oracle、DB2 和 Sql Server,并且您为每个 RDBMS 编写一个单独的 SQL 语句,以便利用该 RDBMS 提供的所有功能。你是怎么做到的?
抛开这个不谈,你对走这条路有什么看法?以你的经验来看值得吗?为什么?为什么不呢?
最佳答案
你不能吃蛋糕并拥有它,请选择以下选项。
- 尽可能使用数据库抽象层,在极少数情况下,当您需要手动查询时(例如性能原因),请坚持最低公分母,不要使用存储过程或任何专有扩展您的数据库必须提供的。在这种情况下,在不同的 RDBMS 上部署应用程序应该很简单。
- 充分利用昂贵的 RDBMS 的功能,但要考虑到您的应用程序不易移植。当需要出现时,您将不得不花费大量精力进行移植和维护。当然,将所有差异封装在单个模块或类中的良好分层设计将有助于这一努力。
换句话说,您应该考虑您的应用程序将部署到多个 RDBMS 的可能性有多大,并做出明智的选择。
关于具有多个 RDBMS 的 PHP、Python、Ruby 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1586008/