建议在存储过程中放入啥逻辑?
Posted
技术标签:
【中文标题】建议在存储过程中放入啥逻辑?【英文标题】:What logic is recommended to put in Stored procedures?建议在存储过程中放入什么逻辑? 【发布时间】:2011-07-24 05:57:40 【问题描述】:我看到了在数据库引擎中运行代码而不是将其分发到数据库之外的优势以及相反的优势。
但我要回答的真正问题是建议在存储过程中放入什么逻辑? 我想我需要例子,应该有数据验证吗?业务规则,如应该这样做?什么时候使用存储过程实际上是一个很好的例子?
提前致谢。
【问题讨论】:
【参考方案1】:在例程中可以使用流控制结构。 例如- IF, WHILE, ... 有时有助于编写逻辑。
当然,sp是可以多次使用的代码。
【讨论】:
但是封装也经常给出这个。您通常不允许实例客户直接调用您的数据库。前面通常有一个服务层,例如 Web 服务。但我明白你的观点。您能否扩展,在例程中的流控制结构等? 我想说这些结构不能在 mysql 脚本中使用,它们仅在源对象中可用; ...如果可以在数据库级别完成特定于数据库的某些操作 - 为什么不这样做呢? sp 的另一个优点是安全选项 - DEFINER/INVOKER。例如,用户无权修改数据。如果这个用户在一个过程中设置了 DEFINER,他/她可以使用这个过程来修改数据,并且对于这个在 DEFINER 中指定的用户的权限将被使用。【参考方案2】:这是个好问题。简短的回答(一如既往)是“视情况而定”
我将在其中包含函数和 tvf...
对我来说:
1) 插入接口。如果您有一个“某物”的逻辑概念,并且您已经使用许多具有紧密关系的表(员工将是一个经典示例)为该事物建模,那么(恕我直言)最好编写一个插入新员工的 sp 和让那个proc处理正确的表插入顺序(处理外键等)。比在您的应用程序中执行所有内联代码更有效
2) 输出接口。有一个在一个地方返回某事物的逻辑表示的 sp 是好的。这意味着基础表可以更改,您将 必须 更改 sp。否则,您必须浏览应用程序的代码库。
我从来没有对数据库中的商业规则感到非常满意,但是很多公司的数据库都在抱怨它们。
【讨论】:
【参考方案3】:这完全取决于你在构建什么,你是如何构建的,你正在与什么样的开发人员合作,并且决策比技术更具宗教性和哲学性。以下是我的一些想法,我敢肯定会有很多人认为所有这些都是错误的 :) 所以将它们视为个人意见,不要真正将它们作为工作的指导方针,并在做出决定之前进行尽职调查和研究。
Against
一堆 SQL 语句,实际上就是这样,因为即使您针对特定架构编译它们,但假设您删除在其中一个过程中使用的列,存储过程是否会给您一个红色错误信息?不,至少我没见过,除非你在每次架构更改后编译每个 SP(我见过的数据库通常没有,我不知道数据库的最新技术)这带来了一个更大的问题您的整个数据库架构都可以编译吗? 版本化? 部署就像部署二进制版本或网站一样?根据我的经验和知识,有很多技术,但它们很难奏效或很好地遵循。
现在可以调试了,存储过程可以debugged或tested而不需要部署它的数据库吗?据我认为或知道您需要整个数据库来调试或测试 SP。只要您可以提供数据依赖项的抽象,您的 Java 代码就可以在不需要整个数据库的情况下独立调试/测试。(我现在是 C# 开发人员,我用 JDK1.2 做了一点 Java)
像封装、抽象和其他相关的面向对象的所有令人敬畏的东西,存储过程可以对特定类的对象私有吗? (有技术可以再次做到这一点,但根据我的经验,它做了多少次零次)。 数据类型?你见过存储过程中的复杂类型处理吗?我的意思是将一组学生对象传递给存储过程,这有多容易或多难?据我所知,在 SQL 中处理复杂类型或制作所有 XML 非常困难。另外,记录、跟踪是如何完成的?就我看到大型 SP 的经验而言,它再次绑定到数据库服务器,并且如果您愿意,它不容易配置为使用其他机制。
假设您知道某个特定的 SP 正在做一些繁重的工作,现在您想产生 10 个线程并并发运行您的部分代码?这有多容易?不知道,又难了。
For
因为存储过程在数据库服务器中运行,而不是真正编译,所以它们比您用 Java 或任何高级语言编写的其他代码具有明显的优势。 大量数据处理,如果您有特殊需要使用大量表来计算某些东西,然后将这些计算的数据更新到一堆其他表等,那么性能会更好(不是scalability
)在这种情况下,代码和数据之间没有数据传输延迟。 更改 - 由于存储过程更改理想情况下是在文本编辑器中打开您的 sp 并在数据库服务器上运行修改后的脚本来部署这种提供了比其他编译语言更大的灵活性,因此可以解除对生产问题的阻碍您更改了几个 SP,然后部署到数据库完成修复用户现在可以使用该应用程序,因为您不需要编译所有依赖项或部署所有部分(deployment
通常在大型项目中很复杂,并且需要几个小时才能完成修正它)。 CRUD - 任何简单的创建、读取、更新、删除操作都应该封装在 SP 中。任何需要您定义临时表或表变量或游标的操作肯定需要重新审视并询问它是否正确?
在您在存储过程或 Java(在您的情况下)中编写一些特性/功能之前,需要考虑更多的因素,但正如我在开始时所说的那样,它完全 取决于。
** 编辑 **
因此,基于这些考虑,最好避免存储过程中的任何逻辑,除非它真的是数据密集型并且不需要任何复杂类型。如果您有一个定义明确的业务逻辑,它是使用 java 对象建模的,那么最好在各自的业务类而不是 SP 中编写逻辑。 SP 应包含与 store data
、update data
、delete data
或 retrieve data
相关的逻辑,在 SP 中应避免使用除此之外的任何其他逻辑。
【讨论】:
看看这个question你在写Java代码的时候有没有问过这样的问题?在您认为 SP 可重复使用之前,还有一点需要考虑。 嘿!感谢您的优点和缺点。但它确实没有说明存储过程中应该包含什么样的逻辑,正如我所提到的,我认为我对利弊有很好的理解。 更新了帖子以直接在编辑部分回答您的问题。以上是关于建议在存储过程中放入啥逻辑?的主要内容,如果未能解决你的问题,请参考以下文章
在persistence.xml 的jta-data-source 中放入啥?
SnappyData:在 build.sbt 和 import 语句中放入啥,以便我可以使用 SnappySession