不同的数据库在SQL支持和差异方面存在差异。实现。有时SQL语法有所不同,有时缺少对某些SQL命令的支持,有时数据库具有其他数据库没有的功能。
考虑到开发人员使用框架(如CakePHP,Codeigniter,Zend等),编写适用于不同数据库(MySQL,PostgreSQL,Oracle,MSSQL,SQLite)的SQL查询的优秀做法是什么?那提供了一个数据库抽象层?开发人员应该避免使用哪种SQL语法?
答案 0 :(得分:9)
然后你开始使用ORM,你会发现对于复杂的查询 - 它不会执行。人们很难写出表现良好的SQL - 我不希望数据库抽象层更好。大多数ORM支持本机存储过程......这违背了使用ORM的目的。
ANSI SQL正在努力使SQL在数据库中更具可移植性,但采用率因供应商而异。 ANSI语法并不一定意味着它的表现与本机语法一样(IE:COALESCE vs native ISNULL / IFNULL / NVL / etc)。
现实是为了获得性能最佳的数据库交互,您需要为每个涉及的供应商编写自定义代码。有些人会用这个来说明为什么数据库应该只是基本的持久性,因为它更容易维护一个中央应用程序。但是当你处理高使用率的应用程序时,这会很糟糕,因为应用程序和数据库之间的多次访问,数据类型和表格设计都很差。坦率地说,这是浪费数据库...
答案 1 :(得分:3)
“谨慎使用ANSI SQL”是您问题的最直接答案。
但是,请记住Jeremy Zawodny的these words,特别是:
优秀的工程师会尝试为工作选择最好的工具,然后尽一切可能利用这些工具 他们工具的独特和最强大的功能。在数据库世界中,这意味着特定的提示, 索引,数据类型,甚至表结构决策。如果你真的限制自己的子集 在所有主要的RDBMS中都很常见的功能,你自己和你的客户都会受到很大的伤害。
人们真正想要的是ORM是一种非关系型数据存储,可以很容易地转换为编程语言数据结构(例如Ruby对象)。如果你需要这个,你可能想要检查其中一个“NoSQL”选项(MongoDB,CouchDB是两个比较成熟的选项)。
答案 2 :(得分:0)
例如,您可以使用ORM,它将从每个数据库中抽象出细节。虽然您必须确保您的ORM支持所需的所有数据库。
如果找不到支持所有数据库的ORM,那么可能找到一个覆盖最多的数据库并扩展php以处理最后一个数据库。虽然我怀疑情况会是这样。
答案 3 :(得分:0)
您正在寻找Object-relational mapping (ORM)。
对象关系映射(ORM,O / RM, 和计算机软件中的O / R映射 是一种编程技术 在不兼容之间转换数据 面向对象的类型系统 编程语言。这创造了, 实际上,一个“虚拟对象数据库” 可以在内部使用 编程语言。
你可以去那里着名的Doctrine。另外看看:
答案 4 :(得分:0)
正如量子汤所提到的,只是没有。如果你看一下你列出的每个框架,你会发现它们都使用ORM或某种数据库抽象层来插入/提取数据。这允许您编写与所需数据源无关的数据库中立代码。然后,ORM使用正确的数据源“驱动程序”将您的意图转换为每个数据源可理解的命令。
所以诀窍是1.)为ORM或数据库抽象层定义通用接口;然后2.)为ORM编写适当的驱动程序。然后,每次要使用新类型的数据源(包括平面文件或CSV)时,添加新驱动程序都很简单。