【问题标题】:Simplest way to develop an app that can use multiple types of databases?开发可以使用多种类型数据库的应用程序的最简单方法是什么?
【发布时间】:2011-02-23 19:36:19
【问题描述】:

我有一个类的项目,它要求如果使用数据库,则存在可供用户选择要使用的数据库的选项,该数据库可能是不同类型的。所以虽然我可以使用例如MySQL 用于开发,在项目的最终版本中,用户必须能够在安装时选择数据库(Oracle、MySQL、SQLite 等)。如果有简单的方法,最简单的方法是什么?

使用的语言由我决定,只要它被部门的 Linux 机器支持,所以它可以是 Java、PHP、Perl 等。我一直在研究并找到有关 ODBC、JDBC 和 SQLJ 的信息(例如正如this) 但我对数据库很陌生,所以我很难弄清楚什么最适合我的需求。也可能没有足够简单的方法来做到这一点。教授承认他也不是数据库专家,而且他似乎认为这很容易,但不知道需要什么。

这是一个网络应用程序,但它应该相当简单,例如在客户端使用 HTML 和 Javascript,在服务器端使用 Java 和 MySQL 数据库。没有提到框架,所以我认为它们太多了。如有必要,我可以选择使用 Tomcat 或 Apache,但总体思路是保持简单,并且使用的所有内容都应该能够通过用户级别的访问权限进行安装/更改/配置。因此,我认为必须重新编译 PHP 以使用 ODBC 之类的东西会被淘汰。

在这些限制范围内,与任意数据库交互的最佳方式(如果有的话)是什么?

【问题讨论】:

    标签: database web-applications


    【解决方案1】:

    我认为您会遇到的问题是 SQL 并不是真正的标准。我的意思是供应商(Oracle、MySQL 等)已经包含了非 SQL 标准的类型和功能,以便将您“绑定”到他们的数据库,例如 Oracle 的 VARCHAR2 等。

    当我在大学时,我最后一年的项目是创建一个应用程序,允许用户使用带有 Java 前端的 JDBC 创建关系数据库。

    JDBC 的使用非常简单,但问题是要找到所有供应商共有的足够多的 SQL 功能/类型。所以他们可以毫无问题地在它们之间切换。解决这个问题的一种方法是实现模块来处理特定于供应商的问题并编写在它们之间进行转换的方法。因此,例如,您可能会为 MySQL 开发一个数据库,其中包含大量 MySQL 特定代码,但是您可能想要使用 Oracle,然后就会出现需要解决的问题。

    我会花一些时间查看所有供应商实施的核心 SQL 标准,然后为这些功能编写代码。但我认为您使用的技术不是问题,而是您创建的 SQL。

    希望对你有帮助,如果没有帮助请见谅!

    【讨论】:

    • 我一定会记住这一点。我假设对于相当基本的数据检索/存储,例如这个项目将使用它不会是一个问题,但也许不是?您能否推荐任何有关将 JDBC 与任意数据库一起使用的资源?我一直在搜索,但没有找到任何不需要重新编译即可指定任意数据库的示例。
    • @Maltiriel - 我已经很久没有这样做了,但我仍然记得关于数据库的问题,这个链接 (oreilly.com/catalog/javadata/chapter/ch04.html) 是你要找的东西吗?我的大部分问题也是由于我让用户拖放(如 Access)并自己生成 SQL 代码以在任何其他选择的数据库上运行而引起的。我猜你没有从你的程序中生成任何 SQL 代码?
    • 是的,就是这样。非常感谢!在这一点上,我还没有深入了解数据库访问将如何工作。我仍然只是在计划使用什么技术。唯一的症结是能够使用任意数据库,所以这就是我想首先解决的问题......
    【解决方案2】:

    嗯,您可以采用两种方式(在 Java 中):

    1. 您可以开发自己的类来处理不同的数据库并在 JDBC 中加载它们的驱动程序。这样您将为自己创建一个数据访问层,这需要一些时间。

    2. 您可以使用 Hibernate(或其他 ORM)。这样 Hibernate 会为你处理好事情,你只需要知道如何使用 Hibernate。学习 Hibernate 可能需要一些时间,但是当您习惯它时,它会对您未来的项目非常有用。

    【讨论】:

    • 你能解释一下为什么我需要不同的类来处理不同的数据库吗?是非标准 SQL 问题还是其他问题?
    • 就是界面。每个 RDBMS 在 JDBC 中都有一个特殊的数据库驱动程序。如果您尝试做一些整洁的事情,那么您需要不同的课程,例如对于 Oracle、MySQL 等。否则,如果您尝试在同一个类中为不同的 RDBMS 执行 Selects,那么您最终会遇到噩梦!
    • 我不完全明白你的意思...这将是一个非常简单的应用程序,因此数据库查询也将非常简单。只有在利用各种数据库的独特功能时才需要单独的类吗?
    【解决方案3】:

    如果您想将 Java 固定在 Hibernate 中(不需要框架)。 Hibernate 相当容易使用。您编写的 HQL 会被翻译成您正在使用的数据库所需的 SQL。

    【讨论】:

      【解决方案4】:

      也许使用object relational mapper (ORM) 或database abstraction layer (DAL)。它们旨在为多个数据库后端提供标准 API,从而可以在不同后端之间切换,而对代码的更改最少或不更改。例如,在 Python 中,一个流行的 ORM 是 SQLAlchemy,一个优秀的 DAL 是 web2py DAL(它是 web2py framework 的一部分,但也可以在框架之外用作独立的 DAL)。其他语言也有许多其他选项。

      【讨论】:

        【解决方案5】:

        使用带有数据库抽象层和 orm 的框架。试试symfonyrails

        【讨论】:

          【解决方案6】:

          有很多 Object 关系数据库框架,除非你更喜欢 jdbc。对于简单/小型应用程序,这应该可以正常工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-08
            • 2010-12-03
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多