假设我想要一个可以在后端轻松切换数据库的应用程序。
我主要将 SQL Server 视为主要后端,但可以灵活地使用另一个数据库引擎。Firebird 和 PostGreSQL 似乎(从我简短的 wikipedia 游览中)与 SQL Server 最相似(而且它们是免费的)。
Firebird、PostGreSQL 和 MS SQL Server 的数据库设置、访问、查询等有多相似?
假设我想要一个可以在后端轻松切换数据库的应用程序。
我主要将 SQL Server 视为主要后端,但可以灵活地使用另一个数据库引擎。Firebird 和 PostGreSQL 似乎(从我简短的 wikipedia 游览中)与 SQL Server 最相似(而且它们是免费的)。
Firebird、PostGreSQL 和 MS SQL Server 的数据库设置、访问、查询等有多相似?
不幸的是,SQL 因提供商而异。除了最简单的 SQL 之外,几乎不可能编写所有的 SQL 来在多个 RDBMS 上运行——然后你就进入了最低公分母领域。最好使用抽象层至少处理与数据库的连接(包括访问、发送查询),以及使用 ORM 来处理 SQL 本身或每个提供者的 SQL。
如果您想了解它们如何变化 - 很好的示例是自动递增 id 并获取最后插入记录的 ID。
我在一个项目中工作,其中绝对需要支持许多数据库,至少包括 Access、SQL Server 和 Oracle。
所以我知道这是可以做到的。大多数情况下,DML (SELECT,UPDATE,INSERT...) 是相同的,当然我们没有遇到太大的问题,使其在所有数据库中都能正常工作——只是偶尔的烦恼。MySQL 在当时是个例外,因为它根本就没有足够的能力。
我们在 DDL 中发现了大多数差异,但使用正确的架构(我们拥有),修复这个问题并不难。
唯一导致我们出现问题的是生成唯一的 id - 自动增量是非标准的。幸运的是,在大约 40 个表的数据库中,只有少数地方需要唯一 ID(良好的数据库设计)。最后,我们在代码中生成唯一 ID,并处理任何冲突(事务中的所有内容)。
它确实让事情变得更容易了,因为我们避免了对 ID 字段使用自动增量,很难想到唯一键 - 但从长远来看会更好。
好吧,CRUD 的东西应该到处都是一样的,但是如果你构建任何复杂的东西,你可能会想要使用触发器和存储过程,这就是兼容性变低的地方。编写与 DBMS 无关的应用程序通常意味着将大部分业务逻辑移到数据库之外,因此在这种情况下,恕我直言,拥有 3 层应用程序是必须的。
或者,您可以使用一些类似于抽象层的包装库,但我还没有看到能够在一系列 DBMS-es 上正确完成这项工作的包装库。当然,这也取决于您使用的编程语言。
正如其他答案所指出的,一旦您超出了基本的 SELECT/INSERT 内容(有时甚至在那里),DBMS 就会发生很大的变化。
我们还必须保持跨多个 DBMS 的兼容性。在我看来,最好的方法通常是使用某种兼容层。我们有一个内部的 DB 抽象库,但有几个可用的工具。
特别是,查看流行的 ORM(Hibernate、nHibernate 等)可能会有所帮助。它们通常提供 DB 独立性作为一种副作用。至少 Hibernate 还具有一种特殊的查询语言,它会自动为您使用的 DBMS 翻译成 SQL。