为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL存储过程使用还是不使用它们

/ 猿问

MySQL存储过程使用还是不使用它们

我们正在一个新项目的开始,我们真的想知道我们是否应该在MySQL中使用存储过程。


我们将仅使用存储过程来插入和更新业务模型实体。有几个表代表一个模型实体,我们将在那些存储过程的插入/更新中对其进行抽象。


另一方面,我们可以从Model层调用插入和更新,但是不能在MySQL中,而是在PHP中。


根据您的经验,哪个是最佳选择?两种方法的优点和缺点。就高性能而言,哪个是最快的?


PS:这是一个大多数阅读的Web项目,而高性能是最重要的要求。


查看完整描述

3 回答

?
富国沪深

与实际的编程语言代码不同,它们:

  • 不可移植(每个数据库都有其自己的PL / SQL版本。有时同一数据库的不同版本不兼容-我已经看到了!)

  • 难以测试-您需要一个真实的(dev)数据库实例对其进行测试,因此几乎不可能对它们的代码进行构建的单元测试

  • 不容易更新/发布-您必须删除/创建它们,即修改生产数据库以释放它们

  • 没有库支持(为什么在别人拥有时编写代码)

  • 不容易与其他技术集成(尝试从中调用Web服务)

  • 他们使用的语言与Fortran一样原始,因此难以完成有用的编码,因此很难表达业务逻辑,即使通常这是其主要目的。

  • 不提供调试/跟踪/消息记录等功能(某些数据库可能支持此功能-虽然我没有看到)

  • 缺乏像样的IDE来帮助语法和链接到其他现有过程(例如,像Eclipse的Java那样)

  • 熟练的编码人员比应用编码人员稀有且昂贵

  • 它们的“高性能”是一个神话,因为它们通常在数据库服务器上执行,因此通常会增加数据库服务器的负载,因此使用它们通常会降低最大事务吞吐量

  • 无法有效共享常量(通常通过在过程中创建表并对其进行查询来解决-非常低效)

  • 等等

如果您有一个非常特定于数据库的操作(例如,用于维护数据库完整性的事务内操作),或者使您的过程保持原子性和简单性,那么也许您可以考虑使用它们。

在预先指定“高性能”时,建议谨慎。它通常会导致错误的选择,以牺牲好的设计为代价,并且比您想的要早得多。

使用存储过程的后果自负(曾经去过那里并且从不想回头的人)。我的建议是避免它们像瘟疫一样。


查看完整回答
反对 回复 2019-12-21
?
函数式编程

与编程代码不同,它们:

  • 使得SQL注入攻击几乎是不可能的(除非您正在 从过程内部
    构造和执行动态
    SQL)

  • 作为标注的一部分,要求通过IPC发送的数据少得多

  • 使数据库能够获得更好的缓存计划和结果集(由于其内部缓存结构,这在MySQL中显然不那么有效)

  • 可以很容易地进行隔离测试(即不作为JUnit测试的一部分)

  • 在它们允许您使用特定于数据库的功能的意义上是可移植的,这些功能被抽象在过程名称之后(在代码中,您陷入了通用SQL类型的东西)

  • 几乎永远不会比从代码调用的SQL慢

但是,正如波西米亚人所说,它也有很多弊端(这只是提供了另一个观点)。在决定最适合自己的东西之前,您可能必须先进行基准测试。


查看完整回答
反对 回复 2019-12-21
?
慕桂英546537

至于性能,它们有潜力在将来的MySQL版本中真正发挥作用(在SQL Server或Oracle下,它们是真正的享受!)。然而,对于其他所有...他们完全破坏了竞争。我总结一下:

  • 安全性:您只能为您的应用赋予EXECUTE权限,一切都很好。您的SP将插入更新选择...,没有任何可能的泄漏。这意味着对模型的全局控制以及强制的数据安全性。

  • 安全性2:我知道这种情况很少见,但有时php代码会从服务器中泄漏出来(即,对公众可见)。如果其中包含您的查询,则可能的攻击者知道您的模型。这很奇怪,但我还是想发信号

  • 工作队:是的,创建高效的SQL SP需要一些特定的资源,有时甚至更昂贵。但是,如果您认为仅由于将查询集成到客户端中就不需要这些资源,那么您将遇到严重的问题。我要提到一个Web开发的类比:将视图与其他视图分开是很好的,因为您的设计师可以使用自己的技术,而程序员可以专注于对业务层进行编程。

  • 封装业务层:使用存储过程可以完全隔离其所属的业务:该死的数据库。

  • 可快速测试:外壳下有一个命令行,您的代码也经过了测试。

  • 不受客户端技术的影响:如果明天您想从php切换到其他版本,那就没问题了。好的,仅将这些SQL存储在单独的文件中也可以解决问题,是的。另外,在注释中,如果决定切换sql引擎,那么您将有很多工作要做。无论如何,您必须有充分的理由这样做,因为对于大型项目和大型公司,这种情况很少发生(主要是由于成本和人力资源管理)

  • 强制执行3层以上的敏捷开发:如果数据库与客户端代码不在同一服务器上,则您可能拥有不同的服务器,但该数据库只有一台服务器。在这种情况下,当您需要更改与SQL相关的代码时,无需升级任何php服务器。

好的,我认为这是我必须在该主题上说的最重要的事情。我本着两种精神(SP与客户)发展的,我真的非常钟爱SP风格。我只是希望Mysql为他们提供一个真正的IDE,因为现在在有限的屁股上有点痛苦。


查看完整回答
反对 回复 2019-12-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信