sql - 数据库抽象——支持多种语法

标签 sql database data-access-layer database-abstraction

在我正在处理的 PHP 项目中,我们需要创建一些 DAL 扩展来支持多个数据库平台。我们遇到的主要问题是不同的平台有不同的语法——值得注意的是 MySQL 和 MSSQL 是完全不同的。

最好的解决方案是什么?

这是我们讨论过的几个:

基于类的 SQL 构建

这将涉及创建一个允许您逐位构建 SQL 查询的类。例如:

$stmt = new SQL_Stmt('mysql');
$stmt->set_type('select');
$stmt->set_columns('*');
$stmt->set_where(array('id' => 4));
$stmt->set_order('id', 'desc');
$stmt->set_limit(0, 30);
$stmt->exec();

虽然单个查询确实涉及很多行。

SQL 语法重新格式化

此选项更简洁 - 它会读取 SQL 代码并根据输入和输出语言重新格式化它。然而,就解析而言,我认为这是一个慢得多的解决方案。

最佳答案

我推荐基于类的 SQL 构建并推荐 Doctrine , Zend_DbMDB2 .是的,如果它需要更多行来编写简单的选择,但至少你可以依赖解析器并且不需要重新发明轮子。

使用任何 DBAL 都需要在速度上进行权衡,而不仅仅是数据库执行,但是当您第一次使用其中任何一个时,都会比您真正熟悉它时更加痛苦。此外,我几乎 100% 确定生成的代码不是最快的 SQL 查询,但这是我之前所说的权衡。

最终取决于您,所以即使我不会这样做并且这肯定不是不可能的,但问题仍然存在,您是否可以通过实现自己的 DBAL 实际上节省时间和资源(从长远来看)。

关于sql - 数据库抽象——支持多种语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/216329/

相关文章:

html - 如何下载维基百科文章并存储在数据库中

php - 奇怪的mysqli未知错误?

sql - 使用DAL2 : Value cannot be null.访问数据参数名称:con

mysql - 有没有办法列出多列中的不同字段结果

java - 如何检索数据库中已保存的字段?

SQL子查询试图获得两个表中同一列的最大差异

c# - 在 DAL 中使用单例模式的优缺点

sql - 插入到已删除的输出子句中

mysql - 在表中添加首字母必须为0的列?