我的老板要求我只编写ANSI SQL以使其与数据库无关.但我了解到并不是那么容易,因为没有数据库完全兼容ANSI SQL.SQL代码很少在没有修改的情况下在数据库系统之间移植.
我看到人们以不同的方式使他们的程序数据库独立.例如:
将SQL语句外部化为资源文件.
编写许多提供者类来支持不同的数据库.
只写简单的SQL,并远离高级函数/连接.
你总是把你的代码写成"任何数据库就绪"吗?或者只在需要时才这样做?如果是的话,你是如何实现的?
您可以使用许多对象/关系映射器工具之一,如Hibernate/NHibernate,LLBLGen等.这可以让您在数据库可移植性方面走得很远.无论你做什么,你需要在你的模型和你的代码的其余部分之间有一些抽象层.这并不意味着您需要某种依赖注入基础架构,但良好的OO设计可以让您走得更远.此外,坚持使用简单的SQL并认为可以提高可移植性是相当幼稚的.如果您的应用程序是微不足道的,并且只使用非常简单的查询,那将是真的.
至于总是将应用程序编写为"任何数据库就绪",我通常使用某种抽象层,因此从一个数据库系统移动到另一个数据库系统并不困难.但是,在许多情况下,这不是必需的,您正在为Oracle平台或SQL Server或MySQL开发,因此您不应仅仅为了完全无缝转换的可能性而牺牲所选RDBMS的优势.然而,如果您构建一个良好的抽象层,即使针对特定的RDBMS,也不一定非常难以迁移到不同的RDBMS.
要将数据库引擎与应用程序分离,请使用数据库抽象层(也称为数据访问层或DAL).您没有提到您使用的语言,但是所有主要语言都有很好的数据库抽象库.
但是,通过避免特定于数据库的优化,您将错失特定品牌的优势.我通常抽象可能的东西并使用可用的东西.更改数据库引擎是一项重大决策,并不经常发生,最好使用最多可用的工具.