我们可以有太多的存储过程吗?

时间:2020-03-06 14:44:46  来源:igfitidea点击:

是否存在太多的存储过程?

我知道我们可以拥有的数量没有限制,但这是否是出于任何性能或者架构上的原因而不是要创建成百上千的产品?

解决方案

我认为,只要我们将它们命名为uspXXX而不是spXXX,按名称查找将是直接的,因此没有缺点,尽管如果我们有成千上万的内容,我们可能会想对proc进行概括...

除了在更改数据库时还必须维护所有这些事实之外,我们是否还意味着其他事实?那是我的重要原因。最好是能够处理多种方案的方案要少于只能处理一种方案的方案。

对我而言,成百上千的存储过程的最大限制是可维护性。即使这不是直接影响性能,也应该考虑。这是体系结构的观点,我们不仅要为应用程序的初始开发进行规划,而且还要为将来的更改和维护进行规划。

话虽如此,我们应该设计/创建应用程序所需的数量。尽管使用Hibernate,NHibernate,.NET LINQ,我还是会尝试在代码中保留尽可能多的存储过程逻辑,并且仅在速度是决定因素时才将其存储在数据库中。

我只想提一提,维护成为一个问题。谁知道它们都是什么以及它们的用途是什么?当它们只是一个遗留系统的产物而没人能回想起它们的用途却又害怕被弄乱时,那么几年后会发生什么呢?

我认为最主要的问题是不可能,但应该这样做。多数民众赞成在一个想法。

正如其他人所说,这实际上归结于管理方面。过了一会儿,它变成了在大海捞针中找到谚语的针。当命名标准到位时,情况更是如此。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

我的问题是,如果我们谈论的是成百上千的存储过程,为什么不使用某种中间件平台?

称我为老式,但我认为数据库应该只保存数据,而程序应该是制定业务逻辑决策的程序。

不,不是我所知道的。但是,我们应该为它们指定一个良好的命名约定。例如,很多人喜欢用usp_来启动它们(比以sp_开头要快)。

也许报告存储过程应该是usp_reporting_,而业务对象应该是usp_bussiness_,依此类推。只要我们可以管理它们,那么拥有很多它们就不会有问题。

如果它们太大,则可能需要将数据库拆分为多个数据库。这可能更合乎逻辑,并且可以帮助解决数据库的大小等问题。

如果我们有很多存储过程,则会发现我们将自己绑定到一个数据库,其中一些可能不容易转移。

将自己绑定到一个数据库并不是一个好的设计。

而且,如果我们在数据库和业务层上具有业务逻辑,那么维护将成为问题。

在Oracle数据库中,我们可以使用"程序包"将相关过程分组在一起。

其中一些,命名空间将释放。

地狱是的,你可以有太多。几年前,我在一个系统上进行了工作,该系统具有10,000 proc的响应能力。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。太疯狂了。编写系统的人员实际上并不知道如何编程,但他们确实知道如何纠正结构错误的proc,因此他们将几乎所有的应用程序逻辑都放入了proc中。一些过程运行了数千行。管理混乱是一场噩梦。

太多(我无法在沙子上画出一条特定的线)可能表明设计不佳。此外,正如其他人指出的那样,有一些更好的方法可以实现粒度数据库接口,而无需诉诸大量proc。

我的商业SQL Server 2005产品中我只有不到200个,对于某些新报告,它可能在未来几天内再增加10-20个。

如果可能,我会编写"子例程"存储过程,以便每当我发现自己将3或者4个相同的语句放入多个存储过程中时,如果我们明白我的意思了,就该将这几个语句转换为子例程。

我不倾向于使用sproc来执行所有的业务逻辑,我只是​​更喜欢让sproc做任何可能被视为"事务性"的事情,因此在我的客户端代码(在Delphi中,但无论如何)可能会做些奇怪的事情插入或者更新本身,一旦某些事情需要"立即"更新或者插入几件事,就该进行存储了。

我有一个简单的粗略命名约定,以帮助提高可读性(和维护性!)

产品的代号为" Rachel",所以我们有

RP_whatever   - these are general sprocs that update/insert data, 
              - or return small result sets

RXP_whatever  - these are subroutine sprocs that server as 'functions' 
              - or workers to the RP_ type procs

REP_whatever  - these are sprocs that simply act as glorified views almost
              - they don't alter data, they return potentially complex result sets
              - for reporting purposes, etc

XX_whatever   - these are internal test/development/maintenance sprocs 
              - that the client application (or the local dba) would not normally use

命名是任意的,只是为了帮助区别SQL Server使用的sp_前缀。

我想如果我发现我可能会担心数据库中有400-500个存储过程,但是只要我们有一个系统来识别每个存储过程负责哪种活动,那么数百个根本就不是问题。我宁愿追逐数百个sproc中的模式更改(SQL Server工具可以在其中找到依赖项等),而不是尝试追逐我的高级编程语言中的模式更改。

是的你可以。

如果我们大于零,那么我们有太多

任何特定的事情太多,可能意味着我们做错了。配置文件太多,屏幕上的按钮太多...

不能代表其他RDBMS,但是使用PL / SQL的Oracle应用程序应该在逻辑上将过程和功能绑定到程序包中,以防止级联无效并更好地管理代码。

是的,我们可能有太多存储过程。

命名约定确实可以帮上忙。例如,如果我们有一个命名约定,其中始终有表名和InsUpd或者Get,那么很容易在需要时找到正确的存储过程。如果我们没有某种标准的命名约定,那么拿出两个(或者多个)几乎完全相同的过程就很容易了。

在没有标准化命名约定的情况下,很容易找到以下几个... usp_GetCustomersOrder,CustomerOrderGet_sp,GetOrdersByCustomer_sp,spOrderDetailFetch,GetCustOrderInfo等。

当我们有很多存储过程时,另一件事开始发生,我们将拥有一些从未使用过的存储过程,而有些则很少使用...如果我们没有某种跟踪存储过程使用情况的方法,或者会导致很多未使用的程序结束……或者更糟的是,摆脱我们认为从未使用过的程序,然后发现该程序每年仅使用一次或者每季度一次。 :(

杰夫

我们必须将所有代码放在某处。
如果我们将要拥有存储过程(我个人确实喜欢它们,但很多人则不喜欢),那么我们可以根据需要使用它们。至少所有数据库逻辑都在一个地方。不利的一面是,通常没有太多结构来存储已存储的proc的存储桶。

你的来电! :)

当我们拥有健全的命名约定,最新的文档以及足够的单位测试来使它们井井有条时,就不会如此。

我想这里更深层的问题是,所有这些代码还应该去哪里?视图可用于通过标准SQL提供对数据的便捷访问。可以使用功能更强大的应用程序语言和库来生成SQL。存储过程往往会掩盖数据的性质,并给系统带来不必要的抽象,复杂性和维护性层。

有了对象关系映射工具生成基本SQL的功能,任何过度依赖存储过程的系统的开发效率都将降低。使用ORM,只需编写更少的代码。

我的第一个大型项目是使用对象关系映射器开发的,该对象对数据库进行了抽象,因此我们进行了所有面向对象的操作,并且更易于维护和修复错误,并且由于所有数据访问和业务逻辑都是Ccode,因此进行更改特别容易。 ,当涉及到复杂的工作时,系统感觉很慢,因此我们不得不解决这些问题或者重新设计项目,尤其是当ORM必须在数据库中进行复杂的联接时。

我现在在另一家公司工作,该公司的座右铭是"我们的应用程序只是数据库的前端",并且它有其优点和缺点。我们拥有非常快速的应用程序,因为所有数据操作都是在存储过程上完成的,这主要是使用SQL Server 2005,但是,当要进行更改或者对软件进行修复时,由于必须同时进行更改,因此很难, Ccode和SQL存储过程因此就像两次工作一样,与我使用ORM时相反,我们在sql中没有重构或者强类型对象,Management Studio和其他工具可以提供很多帮助,但是通常我们会花更多的时间这样做。

因此,我要说的是,如果我们不打算保留真正复杂的业务数据,那么就可以依赖项目的需求,甚至可以完全避免使用存储过程,而使用使开发人员生活变得更轻松的ORM。如果我们担心性能,并且需要节省所有资源,而不是使用存储过程,那么数量当然会增加我们设计的体系结构,因此例如,如果我们始终有用于CRUD操作的存储过程,则需要一个对于插入,一个用于更新,一个用于删除,一个用于选择,一个用于列出,因为这些是最常见的操作,如果我们有100个业务对象,则将这4个对象相乘即可得到400个存储过程,以便管理最基本的对对象的操作如此,是的,它们可能太多了。

对我来说,使用大量存储过程似乎会使我们朝着与PHP API等效的方向发展。成千上万个与彼此无关的全局功能都归为一类。相互关联的唯一方法是具有一些命名约定,在该约定中,每个函数都以模块名称作为前缀,类似于PHP中的mysql_函数。我认为这很难维护,也很难保持所有内容一致。我认为存储过程对于确实需要在服务器上发生的事情非常有效。一个简单的选择查询,甚至带有联接的选择查询的存储过程可能都已经走了。仅在我们实际上需要在数据库服务器上处理高级逻辑的地方使用存储过程。