Php MySQL中的存储函数-值得做吗?

Php MySQL中的存储函数-值得做吗?,php,mysql,stored-procedures,stored-functions,Php,Mysql,Stored Procedures,Stored Functions,当我第一次进入数据库时,我使用的是SQL Server。我最初是用经典的ASP。我们被告知的一件大事是,如果您使用存储过程,而不是使用ASP SQL命令(我想是“在线”执行),那么您在SQL事务中节省了大量时间。因此,几乎所有我想对数据库做的事情,我都为其编写了一个存储过程,然后从代码中调用了该存储过程 总之,快进几年,我现在用PHP和MySQL(还有一点Python)完成所有工作。有一件事我似乎根本看不到,那就是人们在使用存储过程/函数,所以我并不真正担心它 然而,我突然意识到我只是做错了,并

当我第一次进入数据库时,我使用的是SQL Server。我最初是用经典的ASP。我们被告知的一件大事是,如果您使用存储过程,而不是使用ASP SQL命令(我想是“在线”执行),那么您在SQL事务中节省了大量时间。因此,几乎所有我想对数据库做的事情,我都为其编写了一个存储过程,然后从代码中调用了该存储过程

总之,快进几年,我现在用PHP和MySQL(还有一点Python)完成所有工作。有一件事我似乎根本看不到,那就是人们在使用存储过程/函数,所以我并不真正担心它


然而,我突然意识到我只是做错了,并没有意识到这一点。在MySQL中使用存储函数有什么主要优势吗?我正在建立一个相当大的网站,处理大量的数据库调用。这些调用都是根据我的PHP代码完成的。对于我一直在进行的调用,我是否最好使用存储函数,然后从PHP向函数传递变量?

这取决于具体情况。存储过程是处理功能分解的一种方法,如果有多个应用程序与同一数据库交互,则存储过程是绝对必要的。几年前,使用存储式procures实现所有功能的想法方兴未艾,随着世界向服务/RAD世界的转变,他们正在失去一些优势

存储过程的一些好处是

  • 重用/这当然可以在您的代码库中完成,但它比用10个子连接15次编写同一查询要好得多

  • 安全性—当sp风靡一时时,sql注入攻击开始出现,减少暴露的一种方法是提供参数化sp,在大多数情况下自动清理您的输入

  • 根据定义,关于大型数据库表布局的文档并不总是足以解释您要存储的内容,以及为什么SP有时会向您和您之后的人提供您想要的内容

  • 定义的接口

  • 我认为,假设应用程序设计良好,并且只有在一定规模的项目中才能达到一定程度,所有这些优点都是可以提供的

    一些缺点

  • 冗余功能—我见过很多商店,其中业务和crud逻辑分布在应用程序中,业务逻辑分布在数据库中

  • SPs上缺乏配置管理——虽然已经建立了代码SP管理的程序和工具,但远远落后


  • 这与问“我应该将代码分解为方法/函数/过程并调用它们,还是应该将所有代码都编码到当前函数中?”

    存储过程给您带来的一些优势:

  • 更容易测试。您可以在不运行应用程序的情况下测试存储过程
  • 更容易开发。您可以让DB开发人员编写存储过程,让GUI开发人员编写UI,等等
  • 更容易移植到不同的数据库。更改都包含在数据库中,与应用程序的契约(传递给存储过程的参数)不应更改
  • 从多个前端使用存储过程中的逻辑的能力。您不必在每个需要创建新客户的应用程序中编写相同的客户创建逻辑
  • 最大的缺点是,您必须学习多条规则,并且可能需要使用多个工具。这是在.Net中使用LINQforSQL的主要原因之一。您不必学习SQL,所有内容都包含在.Net代码中


    我们对一切都使用存储过程。它工作得非常好。抽象是你的朋友。

    我认为还有另一个缺点:可伸缩性。数据库可能是架构中最难扩展的部分。这是可以做到的,但比添加几个PHP或Java服务器更具挑战性。因此,如果要考虑可伸缩性,您可能需要平衡将多少业务逻辑放在数据库服务器中,以及将哪些业务逻辑分散在web/app服务器中可以更好地扩展。那么版本控制呢?如果SQL在源代码中,对SQL的更改将存储在源代码存储库(SVN、CVS等)中。您是对的,如果SQL存储在应用程序的源代码中,那么管理起来就更容易了。Marvo,我们使用SQL Server、Oracle和Teradata,我们的DBA似乎能够很好地扩展数据库。“几年前”?多年来,我一直看到他们在衰落。