MySQL存储过程还是php代码?

Omr*_*mri 7 php mysql database stored-procedures

一个普遍的问题,没有特定的情况 - 通常首选使用MySQL存储过程而不是编写执行相同计算和查询的PHP脚本?

每种方法有什么好处?

OMG*_*ies 10

点对点与杰夫阿特伍德"谁需要存储过程,无论如何?" 从2004年开始:

1)存储过程用大型数据库"语言"编写,如PL/SQL(Oracle)或T-SQL(Microsoft).这些所谓的语言是陈旧的,充满了疯狂,不连贯的设计选择,这些选择总是源于十年向后兼容性的曲折演变.你真的不想在这些东西中写很多代码.对于上下文,JavaScript是PL/SQL或T-SQL的一大进步.

回应:在"S",在"SQL"的意思是"结构化",而不是"标准化" - PLSQL和TSQL都是定制的扩展 SQL,这也带来了ANSI SQL发挥作用,因为很少有SQL是数据库无关.通常,如果您希望查询运行良好,则不能依赖ANSI SQL.

ORM不是银弹 - 由于数据库抽象,大多数支持运行本机存储过程/函数以获得性能良好的查询.这很好,但完全违背了ORM的目的......

我永远不会理解为什么网络开发,无数技术的混合(HTML,Javascript/AJAX,Flash ......)总是将SQL作为家庭的黑羊分开.像所有其他人一样,你必须学习它以获得一些东西.必须是使用其他技术时获得的即时满足感......

2)存储过程通常无法在您编写UI的同一IDE中进行调试.每当我在procs中隔离异常时,我必须停止我正在做的事情,破坏我的Toad副本,并加载数据库包以查看出错的地方.经常在两个完全不同的IDE之间进行转换,具有完全不同的接口和语言,并不是完全有效的.

回复:Eclipse或Visual Studio中最初是否有Javascript调试器?不,他们允许插件,以便将产品推出市场,并激活以前不存在的市场.大多数在Visual Studio/Eclipse之外使用Firebug没有问题,为什么SQL调试会有所不同?

3)当出现问题时,存储过程不会提供太多反馈.除非proc通过奇怪的T-SQL或PL/SQL异常处理进行编码,否则我们会根据失败的proc中的特定行返回神秘的"错误",例如Table没有行.呃,好吗?

回应:你缺乏熟悉并不是一种糟糕的语言.就像你从来没有用你选择的语言谷歌那样奇怪的错误...至少Oracle和MySQL会给你错误的参考号.

4)存储过程不能传递对象.所以,如果你不小心,你最终可能会得到很多参数.如果你必须使用proc填充20多个字段的表行,请向20+参数问好.最糟糕的是,如果我传递一个错误的参数 - 太多,不够或不好的数据类型 - 我得到一个通用的"错误调用"错误.Oracle无法告诉我哪些参数出错!因此,我必须手工填写20多个参数,以确定哪一个是罪魁祸首.

响应:SQL基于SET,完全不同于过程/ OO编程.类型接近于对象,但在某些时候,需要在过程/ OO对象和数据库实体之间进行映射.

5)存储过程隐藏业务逻辑.我不知道proc正在做什么,或者它将返回给我什么样的游标(DataSet)或值.我无法查看源代码的PROC(至少,而不诉诸#2,如果我有适当的访问),以验证它实际上是做什么的,我认为它is--还是什么设计者打算做的事.内联SQL可能并不漂亮,但至少我可以在上下文中看到它,以及其他业务逻辑.

回应:这是一件好事(TM) -这就是你如何让模型-视图-控制器(MVC),这样你就可以在任何语言的多个前端,而不必在处理每个语言每次复制的逻辑怪癖要复制那种逻辑.或者,如果有人直接连接到数据库,数据库是否允许添加错误数据?在应用程序和数据库之间来回跳闸浪费时间和资源,您的应用程序永远无法收回.


web*_*1ar 0

只要有可能,最终用户都将受益于 UI 数据的抽象。因此,您应该尝试尽可能多地利用存储过程。