LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 837|回复: 7

关于软件的多种数据库自适应问题

[复制链接]
发表于 2004-10-8 09:31:06 | 显示全部楼层 |阅读模式
比如我做了一个软件,用的是ms sql server,现在用户A说得转到mysql上,用户B说得转到orcle上,用户C说得转到postgresql上,用户D说得转到DB2上....
在不改变软件及数据库结构基本构架的前提下,要做到这一点,有哪些思路可以实现?(我在项目中碰到了这种问题,现在老板下令把我们的软件整改成与数据库无关的通用产品,首先实现ms sql server与oracle的无缝转换)
我的最初想法是:插入一个中间层做预定数据库sql script的转换,但感觉比较难,而且工作量较大。
哪位兄弟有更详细的或者其他的思路吗?
发表于 2004-10-10 11:25:48 | 显示全部楼层
呵呵,没有那么简单的,就算现在很贵很贵的产品,比如DB2 II,也有很大限制。
 楼主| 发表于 2004-10-11 08:42:15 | 显示全部楼层
如果需要考虑数据库执行效率的话,必然要用到各自数据库的一些特性,这样要做通用数据库的软件产品基本上是不可能的。但如果我不考虑性能问题呢?我相信是可行的,毕竟这些数据库都支持一些基本的sql标准。现在的关键问题是,要怎么做可以最简化、开发成本最低?
发表于 2004-10-12 15:00:39 | 显示全部楼层

简单说一点

这样从两个方面考虑,一个是根据一定的标准选择支持的数据库平台;二是选择
适当的开发策略。

先说选择数据库平台。通常是根据项目的需要,确定一个将要支持的统一技术标
准,这个标准一般都是基于SQL-2/SQL-92或是SQL-3/SQL-99的,是他们的一
个子集(因为没有任何一个数据库平台能支持完整的SQL标准)。然后根据这个
统一标准来选择数据库平台。影响数据库平台选择的另外一个因素是是否提供事
务处理的支持,这对MySql影响很大,其他的我不太清楚。

最后就是开发策略。说说我的经验吧,我的主要开发经验是以下两个平台:

1.win32 ADO
ADO是Microsoft的数据访问层,支持主流数据库,特别的,对于PostgreSQL,
只能选择第三方实现的驱动程序,有一些是开源/免费的。
在自己的程序中要对ADO进行封装,简单点可以写一个类,在这个类中封装了
数据库初始化和获得连接的方法,这样,在你的用户代码中,就可以无视底层是
何种数据库了。

2.Java
一种方式是使用JDBC,并对JDBC进行封装,这样也可以做到一定程度的数据库
无关性。
最好的方式是使用O/R Mapping组件,由O/R Mapping工具来对数据库平台进
行抽象,在你的代码中,只需要操作传统的类/对象即可。这些O/R Mapping
工具目前比较流行的有hibernate/JDOs/EJB/iBats等。
上半年经历过一个项目,通过使用hibernate,可以通过配置文件直接支持
Oracle/Sybase/sql Server/postgresql,没有任何移植性问题发生。
 楼主| 发表于 2004-10-12 18:55:48 | 显示全部楼层
zhnmemc,谢谢你的回复。你的观点让我的思路更清晰了一些。
我们用的是.NET的平台,我们的系统已经对ado.net数据访问层作了封装,类似于你说的ado与jdbc的处理方法,这一方面应该是没有问题的;目前在SQL标准的支持上我们注重得不够,看来我需要检查一下我们的sql标准支持问题。是不是说只要这两个方面都解决好了,就实现了跨数据库呢?还有其他需要注意的条件吗?
发表于 2004-10-13 09:20:39 | 显示全部楼层
个人认为,要实现应用程序的数据库平台无关性,遵循ANSI SQL标准和选择一个良好
的构架设计是解决问题的大方向。但是,这里面也涉及了大量的细节性技术问题。

首先,如何确定一个目标数据库平台的初步选择范围,从PostgreSQL,DB2,MySQL,
Oracle,Sybase,MS SQL Server,Interbase到Pointbase,这里面的每一个
都可能需要加以考虑。开发及维护团队的技术和客户的倾向性会对此产生影响。

其次,还要确定标准,是SQL-92,还是SQL-99,或者SQL-2003?应用程序的复杂性
会对此产生影响。是不是需要stored procedure,是不是需要trigger,是不是
需要sequnce,等等,这些细节决定了选择哪些标准的哪些子集。
这个网址提供了一个标准监测工具(sql92/sql99/sql2003):
http://developer.mimer.com/validator/index.htm
仅供参考。

第三,按照选定的标准去检验预先选定的数据库平台,看看哪些数据库符合要求,
哪些不符合。这需要去查数据库平台的文档。如何在标准和数据库平台之间做取舍,
通常都是一件很麻烦的事。

最后,选择一个好的软件构架也有一些细节需要考虑,比如是不是需要分布(业务
逻辑由中间件承担)?是不是需要分层(表示层/控制层/业务逻辑层/数据访问层是
比较流行的分层方法)?J2EE还是.Net?事务处理是容器管理还是自己管理,以及
是不是需要分布的事务?ADO、ODBC还是JDBC?使用现成O/RMapping工具还是自
己封装?。。。
 楼主| 发表于 2004-10-14 11:47:17 | 显示全部楼层
谢谢zhnmemc兄弟更详细的回复,看来我们还是有很多工作量要做的。接下来我们将会根据这些思路试着去做。
发表于 2004-11-30 11:44:41 | 显示全部楼层

已经早有人帮你做完了,试试hibernate

已经早有人帮你做完了,试试hibernate,网上搜一下,有中文站点,参考手册也很好,基本不用其他的资料了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表