PHP开发人员应该使用MySQL的存储过程吗?

时间:2010-06-02 00:46:09

标签: php mysql stored-procedures

过去10年来,我一直在编写带有SQL Server后端的asp.net应用程序。在那段时间里,我还写了一些PHP应用程序,但不是很多。

我将把我的一些asp.net应用程序移植到PHP并遇到一些问题。在Asp.net世界中,通常理解在访问任何数据库时,使用视图或存储过程是这样做的首选方式。

我一直在阅读一些PHP / MySQL书籍,我开始觉得在MySQL中使用存储过程是不可取的。我在使用这个词时犹豫不决,但这只是我得到的感觉。

所以,我正在寻找的建议基本上是,我是对还是错? PHP开发人员是否完全使用存储过程?或者,它是否被避开了?

8 个答案:

答案 0 :(得分:9)

是否使用存储过程更多是在酒吧进行宗教或政治讨论而不是 需要做的是明确定义您的应用程序层,而不是跨越这些边界。与在数据库外进行查询相比,存储过程有几个优点和缺点。

优势1:存储过程是模块化的。从维护的角度来看,这是一件好事。当您的应用程序出现查询问题时,您可能会同意对存储过程进行故障排除比嵌入在多行GUI代码中的嵌入式查询要容易得多。

优势2:存储过程是可调的。通过使用处理数据库的过程为您的接口工作,您无需修改​​GUI源代码来提高查询的性能。可以对存储过程进行更改 - 在连接方法,不同表等方面 - 对前端接口透明。

优势3:存储过程从客户端抽象或分离服务器端功能。编写GUI应用程序来调用过程要比通过GUI代码构建查询容易得多。

优势4:存储过程通常由数据库开发人员/管理员编写。拥有这些角色的人通常在编写高效查询和SQL语句方面经验丰富。这使GUI应用程序开发人员可以利用他们在应用程序的功能和图形表示部分上的技能。如果您的员工执行他们最适合的任务,那么您最终将产生更好的整体应用程序。

考虑到所有这些,有几个缺点。

缺点1: 如果逻辑完全在存储过程中实现,那么涉及广泛业务逻辑和处理的应用程序可能会对服务器施加过多负载。这种处理的示例包括数据传输,数据遍历,数据转换和密集计算操作。您应该将此类处理移动到业务流程或数据访问逻辑组件,这些组件是比数据库服务器更具可伸缩性的资源。

缺点2: 不要将所有业务逻辑放入存储过程中。当您必须使用Sp语言修改业务逻辑时,维护和应用程序的敏捷性将成为一个问题。例如,支持多个RDBMS的ISV应用程序不需要为每个系统维护单独的存储过程。

缺点3: 编写和维护存储过程通常是一种并非所有开发人员都具备的专业技能。这种情况可能会在项目开发计划中引入瓶颈。

我可能错过了一些优点和缺点,随时发表评论。

答案 1 :(得分:4)

也可能是因为MySQL在版本5之前没有获得存储过程。如果使用预处理语句你应该没问题......只是不要使用内联SQL

答案 2 :(得分:3)

几年前,我最终为PHP / MySQL项目编写了相当数量(~3K行)的存储过程代码。根据我的经验:

  • MySQL存储过程可能无法帮助您提高性能。
  • 使用MySQLi通过预处理语句执行SP可能会引起麻烦。
  • 很难抽象出常见的模式 - 我发现自己比自己更喜欢重复自己。
  • 根据MySQL版本和配置,您可能需要SUPER权限才能创建SP。

如果要移植使用存储过程的代码,最简单的方法就是保留它们。当然可以将它们与PHP和MySQL一起使用,我个人也不会将其称为 inadvisable 。如果我从头开始一个新的PHP项目,我可能不会再选择使用它们。

答案 3 :(得分:0)

存储过程通常是完全浪费精力。

如有疑问,请切实衡量一下表现。您经常会发现存储过程增加了复杂性,没有可识别的好处。您的SP可能没有性能增强。

有些人认为他们非常“重要”。实际衡量绩效而非狡辩或辩论至关重要。

答案 4 :(得分:0)

许多(大多数?)webapps使用数据库抽象层来处理注入漏洞/等。

如果您想要自己的应用程序,请查看PDO。这是一个关于如何使用它的大教程: http://www.devshed.com/c/a/PHP/Using-PDO-Objects-in-PHP-5/

答案 5 :(得分:0)

一般来说,我非常不喜欢存储过程,因为:

  1. 很容易陷入不应该存在的业务逻辑中。
  2. 需要更新存储过程的应用程序更新很难同步,尤其是在您必须恢复到以前的构建时。
  3. 对于任何数据库操作,我建议使用像http://www.doctrine-project.org这样的PHP ORM框架或包含像CakePHP这样的ORM的框架。您还可以更轻松地在SQL Server和MySQL之间切换。

答案 6 :(得分:0)

SQL注入怎么样? 程序允许您对WHERE子句进行参数调用,从而减少注入危险

答案 7 :(得分:0)

以下是关于MySQL存储过程的平衡且知情的文章:http://www.linuxjournal.com/article/9652?page=0,0

在任何数据库和大规模的应用程序中,由于“浪费时间”或“难以维护”或“不提供任何实际利益”而将其解雇,这将是非常不明智的。