你有太多的存储过程吗?

时间:2008-09-25 20:08:49

标签: sql database-design

是否存在太多存储过程?

我知道您可以拥有的数量没有限制,但这是任何性能或体系结构的原因,不能创建数百,数千?

19 个答案:

答案 0 :(得分:8)

答案 1 :(得分:5)

对我来说,数百或数千个商店程序的最大限制是可维护性。尽管这不是直接的性能影响,但它应该是一个考虑因素。这是一个架构立场,您不仅要计划应用程序的初始开发,还要计划未来的更改和维护。

据说你应该设计/创建应用程序所需的数量。虽然使用Hibernate,NHibernate,.NET LINQ,我会尝试在代码中保留尽可能多的存储过程逻辑,并且只有在速度是一个因素时才将它放在数据库中。

答案 2 :(得分:4)

我想这里更深层次的问题是 - 所有代码还应该去哪里?视图可用于通过标准SQL方便地访问数据。可以使用更强大的应用程序语言和库来生成SQL。存储过程往往会模糊数据的性质,并为系统引入不必要的抽象层,复杂性和维护。

鉴于对象关系映射工具生成基本SQL的强大功能,任何过度依赖存储过程的系统开发效率都会降低。使用ORM,编写代码的次数要少得多。

答案 3 :(得分:3)

除了你在对数据库进行更改时必须维护所有这些内容之外,你的意思是什么?这是我的重要原因。最好只有少数可以处理许多场景的场景,而不是只能处理一场场景的数百场景。

答案 4 :(得分:3)

我在我的商业SQL Server 2005产品中只有不到200个,在接下来的几天里,一些新的报告可能会再增加10到20个。

在可能的情况下,我会编写'子程序'的sprocs,这样每当我发现自己在多个sprocs中将3或4个相同的语句放在一起时,是时候将这些语句转换为子程序,如果你看到我的意思

我不倾向于使用sprocs来执行所有的业务逻辑,我只是​​喜欢让sprocs做任何可以被视为'transactional'的事情 - 所以我的客户端代码在哪里(在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个sprocs,我可能会担心,但只要你有一个系统来识别每个sproc负责什么类型的活动,几百个都不是问题。对于。我宁愿在几百个sprocs(SQL Server工具可以帮助你找到依赖项等)中追逐架构更改,而不是试图在我的高级编程语言中追逐架构更改。

答案 5 :(得分:3)

天哪,你可以拥有太多。几年前我在一个系统上工作,有10,000次触发器。这太疯狂了。编写系统的人并不真正知道如何编程,但他们确实知道如何纠正结构严重的过程,因此他们将几乎所有的应用程序逻辑都放在了过程中。一些触发器运行了数千行。管理混乱是一场噩梦。

太多(我无法在沙子中画出特定的线条)可能是设计不佳的一个指标。此外,正如其他人所指出的那样,有更好的方法可以实现粒度数据库接口,而无需使用大量的过程。

答案 6 :(得分:3)

我只想提一下,所有这些事情都会成为一个问题。谁知道他们都是什么以及他们服务的目的是什么?当它们只是传统系统的工件时,几年前会发生什么事情,没有人能够回想起它们的用途,但是害怕它们会被搞乱?

我认为最重要的是不是可能的问题,但是应该这样做。无论如何,这只是一个想法。

答案 7 :(得分:2)

在Oracle数据库中,您可以使用Packages将相关过程组合在一起。

其中一些和你的命名空间会释放。

答案 8 :(得分:2)

我的问题是,如果你在谈论数百或数千个存储过程,为什么不使用某种中间件平台呢?

叫我老式,但我认为数据库应该只保存数据,程序应该是做出业务逻辑决策的那个。

答案 9 :(得分:2)

任何特定事物太多可能意味着你做错了。配置文件太多,屏幕上的按键太多......

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

答案 10 :(得分:2)

对我来说,使用大量存储过程似乎会引导您学习与PHP API相当的东西。可能与彼此无关的数千个全局函数都组合在一起。它们之间关联的唯一方法是使用一些命名约定,其中为每个函数添加模块名称前缀,类似于PHP中的mysql_函数。我认为这很难维护,而且很难保持一致。我认为存储过程适用于真正需要在服务器上进行的事情。简单选择查询的存储过程,甚至是带连接的选择查询都可能会很远。仅使用实际需要在数据库服务器上处理高级逻辑的存储过程。

答案 11 :(得分:1)

不,不是我所知道的。但是,您应该有一个很好的命名约定。例如,用usp_启动它们是很多人喜欢做的事情(比起用sp _开头)。

也许你的报告sprocs应该是usp_reporting_,你的商业对象应该是usp_bussiness_等等。只要你可以管理它们,那么拥有它们就不会有问题。

如果它们太大,您可能希望将数据库拆分为多个数据库。这可能更符合逻辑,可以帮助处理数据库大小等。

答案 12 :(得分:1)

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

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

此外,如果您在数据库和业务层中有业务逻辑,那么维护就成了问题。

答案 13 :(得分:1)

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

答案 14 :(得分:1)

是的,你可以拥有太多的存储过程。

命名约定对此非常有帮助。例如,如果您有一个命名约定,您总是拥有表名和InsUpd或Get,那么在您需要时很容易找到正确的存储过程。如果你没有某种标准的命名约定,那么很容易想出两个(或更多)程序几乎完全相同的事情。

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

当你有很多存储过程时,另一件事就是你会有一些从未使用过的存储过程,而有些只是很少使用...如果你没有某种存储过程的存储过程程序使用你最终会得到许多未使用的程序......或者更糟糕的是,摆脱你认为从未使用的程序,然后发现它只使用一年一次或每季度一次。 :(

杰夫

答案 15 :(得分:1)

虽然你有合理的命名约定,最新的文档和足够的单元测试来保持它们的有序性。

答案 16 :(得分:1)

我的第一个大项目是使用Object Relational Mapper开发的,它抽象了数据库,所以我们做了所有面向对象的工作,并且更容易保持和修复bug,因为所有的数据访问和业务逻辑都是然而,当C#代码执行复杂的事情时,系统感觉很慢,所以我们不得不解决这些问题或重新设计项目,特别是当ORM必须在数据库中进行复杂的连接时。

我现在正在研究另一家公司,该公司的座右铭是“我们的应用程序只是数据库的前端”,它有其优点和缺点。我们有非常快的应用程序,因为所有数据操作都是在存储过程上完成的,这主要是使用SQL Server 2005,但是,当涉及到进行更改或修复软件时,由于必须更改两者, C#代码和SQL存储过程就像它工作两次一样,与我使用ORM时相比,你在sql中没有重构或强类型对象,Management Studio和其他工具有很多帮助,但通常你会花更多的时间这么做

所以我会说,如果你不打算保留非常复杂的业务数据,那么你可能会对项目的需求产生负面影响,甚至可能完全避免使用存储过程并使用ORM来简化开发人员的生活。如果您担心性能并且需要保存所有资源而不是使用存储过程,当然,数量会依赖于您设计的体系结构,因此,如果您始终拥有CRUD操作的存储过程,则需要一个对于插入,一个用于更新,一个用于删除,一个用于选择,一个用于列表,因为这些是最常见的操作,如果您有100个业务对象,则将这些4乘以,并获得400个存储过程以管理最基本的操作对你的对象进行操作,是的,它们可能太多了。

答案 17 :(得分:0)

我认为只要你将它们命名为uspXXX而不是spXXX,按姓名查找将是直接的,所以没有任何缺点 - 尽管你可能想知道如果你有数千个来推广触发......

答案 18 :(得分:-1)

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

你的电话! :)