常用五个常见的数据库库有哪些

如果只有一种 方式使用数据库是囸确的……

您可以用很多的方式创建数据库设计、数据库访问和基于数据库的 PHP 业务逻辑代码但最终一般以错误告终。本文说明了数据库設计和访问数据库的 PHP 代码中出现的五个常见问题以及在遇到这些问题时如何修复它们。

一个常见问题是较老的 PHP 代码直接使用 mysql_ 函数来访问數据库清单 1 展示了如何直接访问数据库。

注意使用了 mysql_connect 函数来访问数据库还要注意查询,其中使用字符串连接来向查询添加 $name 参数

该技術有两个很好的替代方案:PEAR DB 模块和 PHP Data Objects (PDO) 类。两者都从特定数据库选择提供抽象因此,您的代码无需太多调整就可以在 IBM? DB2?、MySQL、PostgreSQL 或者您想要连接到的任何其他数据库上运行

使用 PEAR DB 模块和 PDO 抽象层的另一个价值在于您可以在 SQL 语句中使用 ? 操作符。这样做可使 SQL 更加易于维护且可使您的應用程序免受 SQL 注入攻击。

使用 PEAR DB 的替代代码如下所示

注意,所有直接用到 MySQL 的地方都消除了只有 $dsn 中五个常见的数据库库连接字符串除外。此外我们通过 ? 操作符在 SQL 中使用 $name 变量。然后查询五个常见的数据库通过 query() 方法末尾的 array 被发送进来。

问题 2:不使用自动增量功能

与大多数现玳数据库一样MySQL 能够在每记录的基础上创建自动增量惟一标识符。除此之外我们仍然会看到这样的代码,即首先运行一个 SELECT 语句来找到最夶的 id然后将该 id 增 1,并找到一个新记录清单 3 展示了一个示例坏模式。

这里的 id 字段被简单地指定为整数所以,尽管它应该是惟一的我們还是可以添加任何值,如 CREATE 语句后面的几个 INSERT 语句中所示清单 4 展示了将用户添加到这种类型的模式的 PHP 代码。

add_user.php 中的代码首先执行一个查询以找到 id 的最大值然后文件以 id 值加 1 运行一个 INSERT 语句。该代码在负载很重的服务器上会在竞态条件中失败另外,它也效率低下

那么替代方案昰什么呢?使用 MySQL 中的自动增量特性来自动地为每个插入创建惟一的 ID更新后的模式如下所示。

我们添加了 NOT NULL 标志来指示字段必须不能为空峩们还添加了 AUTO_INCREMENT 标志来指示字段是自动增量的,添加 PRIMARY KEY 标志来指示那个字段是一个 id这些更改加快了速度。清单 6 展示了更新后的 PHP 代码即将用戶插入表中。

现在我不是获得最大的 id 值而是直接使用 INSERT 语句来插入数据,然后使用 SELECT 语句来检索最后插入的记录的 id该代码比最初的版本及其相关模式要简单得多,且效率更高

问题 3:使用多个数据库

偶尔,我们会看到一个应用程序中每个表都在一个单独五个常见的数据库庫中。在非常大五个常见的数据库库中这样做是合理的但是对于一般的应用程序,则不需要这种级别的分割此外,不能跨数据库执行關系查询这会影响使用关系数据库的整体思想,更不用说跨多个数据库管理表会更困难了

那么,多个数据库应该是什么样的呢首先,您需要一些数据清单 7 展示了分成 4 个文件的这样五个常见的数据库。

清单 7. 数据库文件

在这些文件的多数据库版本中您应该将 SQL 语句加载箌一个数据库中,然后将 users SQL 语句加载到另一个数据库中用于在数据库中查询与某个特定用户相关联的文件的 PHP 代码如下所示。

get_user 函数连接到包含用户表五个常见的数据库库并检索给定用户的 IDget_files 函数连接到文件表并检索与给定用户相关联的文件行。

做所有这些事情的一个更好办法昰将数据加载到一个数据库中然后执行查询,比如下面的查询

该代码不仅更短,而且也更容易理解和高效我们不是执行两个查询,洏是执行一个查询

尽管该问题听起来有些牵强,但是在实践中我们通常总结出所有的表应该在同一个数据库中除非有非常迫不得已的悝由。

关系数据库不同于编程语言它们不具有数组类型。相反它们使用表之间的关系来创建对象之间的一到多结构,这与数组具有相哃的效果我在应用程序中看到的一个问题是,工程师试图将数据库当作编程语言来使用即通过使用具有逗号分隔的标识符的文本字符串来创建数组。请看下面的模式

系统中的一个用户可以具有多个文件。在编程语言中应该使用数组来表示与一个用户相关联的文件。茬本例中程序员选择创建一个 files 字段,其中包含一个由逗号分隔的文件 id 列表要得到一个特定用户的所有文件的列表,程序员必须首先从鼡户表中读取行然后解析文件的文本,并为每个文件运行一个单独的 SELECT 语句该代码如下所示。

该技术很慢难以维护,且没有很好地利鼡数据库惟一的解决方案是重新架构模式,以将其转换回到传统的关系形式如下所示。

这里每个文件都通过 user_id 函数与文件表中的用户楿关。这可能与任何将多个文件看成数组的人的思想相反当然,数组不引用其包含的对象 —— 事实上反之亦然。但是在关系数据库中工作原理就是这样的,并且查询也因此要快速且简单得多清单 13 展示了相应的 PHP 代码。

这里我们对数据库进行一次查询,以获得所有的荇代码不复杂,并且它将数据库作为其原有的用途使用

我真不知有多少次看到过这样的大型应用程序,其中的代码首先检索一些实体(比如说客户)然后来回地一个一个地检索它们,以得到每个实体的详细信息我们将其称为 n+1 模式,因为查询要执行这么多次 —— 一次查询检索所有实体的列表然后对于 n 个实体中的每一个执行一次查询。当 n=10 时这还不成其为问题但是当 n=100 或 n=1000 时呢?然后肯定会出现低效率问題清单 14 展示了这种模式的一个例子。

该模式是可靠的其中没有任何错误。问题在于访问数据库以找到一个给定作者的所有书籍的代码Φ如下所示。

如果您看看下面的代码您可能会想,“嘿这才是真正的清楚明了。” 首先得到作者 id,然后得到书籍列表然后得到囿关每本书的信息。的确它很清楚明了,但是其高效吗回答是否定的。看看只是检索 Jack Herrington 的书籍时要执行多少次查询一次获得 id,另一次獲得书籍列表然后每本书执行一次查询。三本书要执行五次查询!

解决方案是用一个函数来执行大量的查询如下所示。

现在检索列表需要一个快速、单个的查询这意味着我将很可能必须具有几个这些类型的具有不同参数的方法,但是实在是没有选择如果您想要具有┅个扩展的 PHP 应用程序,那么必须有效地使用数据库这意味着更智能的查询。

本例的问题是它有点太清晰了通常来说,这些类型的 n+1n*n 问題要微妙得多并且它们只有在数据库管理员在系统具有性能问题时在系统上运行查询剖析器时才会出现。

数据库是强大的工具就跟所囿强大的工具一样,如果您不知道如何正确地使用就会滥用它们识别和解决这些问题的诀窍是更好地理解底层技术。长期以来我老听箌业务逻辑编写人员抱怨,他们不想要必须理解数据库或 SQL 代码他们把数据库当成对象使用,并疑惑性能为什么如此之差

他们没有认识箌,理解 SQL 对于将数据库从一个困难的必需品转换成强大的联盟是多么重要如果您每天使用数据库,但是不熟悉 SQL那么请阅读 The Art of SQL,这本书写嘚很好实践性也很强,可以指导您基本了解数据库

  • 是学习 PHP 的起点。
  • 具有优秀的文档其中的例子展示了如何更好地使用数据库。
  • 访问 developerWorks 获得广泛的 how-to 信息、工具和项目更新,帮助您利用开放源码技术进行开发并将它们与 IBM 产品结合使用。
  • 要聆听对软件开发人员有兴趣的访談和讨论请检查 。
  • 用 革新您的下一个开放源码开发项目这些软件可通过下载或 DVD 获得。
}

是甲骨文公司的一款关系数据库管理系统可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好(最大的好处就是其跨平台的特点如linux和Windows)、使鼡方便、功能强,适用于各类大、中、小、微机环境它是一种高效率、可靠性好的 适应高吞吐量五个常见的数据库库解决方案。

MySQL是一种開放源代码的关系型数据库管理系统(RDBMS)MySQL数据库系统使用最常用五个常见的数据库库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL数據库也是可以跨平台使用的(如linux和Windows通常被中小企业所青睐。

美国Microsoft公司推出的一种关系型数据库系统SQL Server是一个可扩展的、高性能的、为汾布式客户机/服务器计算所设计五个常见的数据库库管理系统,实现了与WindowsNT的有机结合提供了基于事务的企业级信息管理系统方案。

该数據的缺点就是不能跨平台使用

}

我要回帖

更多关于 五个常见的数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信