2010-05-05 67 views
1

将我的web应用程序的常见SQL查询存储在数据库中以供执行使用时,是否认为是疯狂的?或者这是常见的做法?或者是不可能的?存储的查询?

我的想法是这样,我避免了将SQL编码到我的应用程序文件中,并添加了另一个抽象层次。

这是疯了吗?这是一个存储过程是什么?或者那是别的?


编辑:下面的答案为“存储过程”背景是有用的,但没有回答我的核心问题:一个是“存储过程”只是当我有一个包含查询能够在数据库表叫做?即像这样的东西

INDEX | NAME   | QUERY 
1  | show_names | "SELECT names.first, names.last FROM names;" 
2  | show_5_cities | "SELECT cities.city FROM cities LIMIT 0,5;" 
etc. 

或者是否有更复杂的机制,包含存储过程的概念?我的例子是人们做某事的一个实际例子吗?

+0

我见过一些开发人员正在做什么更新显示。它工作得不好,过于复杂,而且使生活困难。所以,不,这是不正常的,这不是一个存储过程。 – NotMe 2010-05-06 15:50:36

回答

2

随着为什么使用存储过程MUG4N最伟大的原因,这里有三个:

安全

您可以授予访问您的应用程序,同时拒绝直接访问表来执行存储过程。

认为纵深防御。如果您的应用程序被破解,那么它们将被限制为只执行您定义的程序。这意味着像'drop table'这样的东西会被明确禁止,除非你有一个程序来做到这一点。

相反,如果你的应用程序被破解,你允许应用完全访问您的SQL Server,那么两件事情之一会发生。要么你的数据消失和/或黑客很容易得到一份副本。


单元测试。 如果您可以直接点击它们而无需通过应用程序本身,那么单元测试您的查询就容易多了。


在航班变更: 如果您需要在您发布您的网站,修改查询,它更容易只是做出比重新部署可能已经经历了自上次部署其他更改代码PROC变化。例如,假设您的页面效果不佳。评估之后,您确定只更改查询中的连接就可以解决此问题。修改proc并去。

+0

THX的另外 – MUG4N 2010-05-06 10:50:01

+0

给你绿色的检查,为您的文章和您的评论(这回答了具体的问题) 。 – phpeffedup 2010-05-06 18:47:19

1

在我看来,你应该明确地使用存储过程。这是常见的做法!

这里提供了两个使用存储过程的优点:

他们将在各种环境中运行,没有必要重新创建的逻辑。由于它们位于数据库服务器上,因此使用的应用程序环境没有区别 - 存储过程保持一致。如果您的设置涉及不同的客户端,则使用不同的编程语言 - 逻辑保留在一个地方。 Web开发人员通常较少使用此功能,因为Web服务器和数据库服务器通常紧密相连。但是,在复杂的客户端 - 服务器设置中,这是一个很大的优势。客户端在更新后会自动与过程逻辑同步。

它们可以减少网络流量。复杂的重复性任务可能需要获得结果,向它们应用一些逻辑,并使用它来获得更多结果。如果这只需在数据库服务器上完成,则不需要将结果集和新查询从应用程序服务器来回发送到数据库服务器。网络流量是导致性能问题的常见瓶颈,存储过程可以帮助减少这种情况。但更多的时候,数据库服务器本身就是瓶颈,所以这可能不是什么好处。

+0

“Web开发人员通常较少使用此功能,因为Web服务器和数据库服务器通常紧密相连,但在复杂的客户端 - 服务器设置中,这是一大优势。”同意..这可能不是一些应用程序的情况。但是在大多数Web开发平台上,我认为这通常是可以避免的。 – 2010-05-05 21:03:09

+0

对于用户数量有限且数据要求相当简单的相对简单的网络应用程序,存储的特效可能比他们的价值更麻烦。但是,在复杂的企业环境中,它们可以在可伸缩性和性能方面发挥巨大作用。 – camainc 2010-05-05 21:06:51

+0

它们可能会对性能产生负面影响,特别是使用缓存的计划和直方图优化指标 - 并且那更不用说收口窥视的问题导致计划中毒 - 但IIRC MySQL不与调试航线实现绑定,偷看 – symcbean 2010-05-06 12:21:55

1

的想法肯定有它的吸引力 - 但问题是,他们几乎是不可能的规模。我从来没有见过一个可扩展的解决方案,以保持存储的特效(尤其是在MySQL),这并没有使我快门。

因为它似乎你的标题的PHP/MySQL的路线,我给我的经验与存储特效的几个例子在MySQL:

  • 他们一般都是远远低于可读性,要困难得多写的比PHP。
  • 他们做调试的噩梦
    • 试图找出为什么改变TABLE_1值触发TABLE_2的变化(如果你甚至幸运地认识到,出现这种情况),更难以通过观察确定通过数十个存储过程,比如说,查看处理对table_1的更改的Model
  • 据我所知是存储的特效/触发器/等集成到任何版本控制系统没有标准化&自动化的方式
+0

问题。使用存储过程不会阻止您使用MVC模式。换句话说,如果您正在查看模型以确定运行的是哪个查询,那么您可以轻松查看模型以确定运行哪个进程。 – NotMe 2010-05-05 21:07:49

+0

关于版本控制:它与版本化数据库表模式没有区别:编写数据库脚本并将其存储在您选择的版本控制系统中。 – NotMe 2010-05-05 21:10:27

+0

另外在调试时:当您保存存储过程时,它会被编译,您可以放心地使用语法。当SQL嵌入在你的PHP代码,你可以很轻松地部署一些试图“seelct ID,名称格式用户” – NotMe 2010-05-05 21:13:52

0

存储过程只是一个或多个SQL语句是“预编译“并存在于数据库中。您可以调用它们来返回一行或多行数据,或者更新,插入或删除数据。

如果您告诉我们您所使用的web框架和数据库,我们可以给你如何调用存储过程,或者至少指向你的两篇文章,让你去实际的例子。

你也可以考虑使用ORM框架,比如Hibernate。这将使您摆脱完全处理SQL代码。我是一名.Net开发人员,所以我不确定PHP/MySQL平台上有什么可用的,但我确定有很多选择。

-1

你应该想想,开发商业级分层应用程序时,总有数据库背后的人使其安全可靠的,其他人都在应用程序逻辑和其他人后面的网页代码后面,这样你就可以得到最重要的是共同努力。

一旦应用程序设计好了,每个人都开始制作他们的实现,db人员给其他人一些API来隐藏SQL,开发人员不必考虑它并专注于他们的代码,我曾作为db开发人员使用过一些COM技术来克服应用程序逻辑的扩展和修改或重用,这些产品中的数据库太重要了,以至于无法将其置于非常广泛的环境中,因此这是一个非常严重的问题。

但在大多数情况下,Web应用程序是通过网页开发者所做的,他们往往没有设计时间,所以他们不使用存储过程使得在不久的时间大的变化,此外,他们甚至没有安全执行或尝试将安全性留给应用程序,使数据库不受保护并容易受到攻击。

如果你正在做所有事情,经常更换产品,你应该避免它们,因为它会双重工作,并且大部分时间都是无用的,一旦你稳定了逻辑,那么你可以开始将更重的查询迁移到存储程序。