Sql 固态存储过程和函数

Sql 固态存储过程和函数,sql,sql-server,oop,design-patterns,stored-procedures,Sql,Sql Server,Oop,Design Patterns,Stored Procedures,我想开始在我正在使用的应用程序中更多地使用存储过程。该应用程序搜索十几个数据库。应用程序将信息存储在自己的数据库中 我在考虑将业务逻辑偏移到特定数据库中的存储过程。因此,如果该逻辑是所有外部数据库的通用逻辑,则将其保存在应用程序(.NET)中。如果逻辑特定于数据库,则创建存储过程 我不确定SOLID如何处理存储过程和函数,因为没有接口或抽象。以下帖子似乎建议您尝试合并查询:。例如,如果一个存储过程有四条SQL语句,那么为什么不尝试将它们组合成一条SQL语句呢?这是邮报上说的吗?这是一个可靠的方法

我想开始在我正在使用的应用程序中更多地使用存储过程。该应用程序搜索十几个数据库。应用程序将信息存储在自己的数据库中

我在考虑将业务逻辑偏移到特定数据库中的存储过程。因此,如果该逻辑是所有外部数据库的通用逻辑,则将其保存在应用程序(.NET)中。如果逻辑特定于数据库,则创建存储过程

我不确定SOLID如何处理存储过程和函数,因为没有接口或抽象。以下帖子似乎建议您尝试合并查询:。例如,如果一个存储过程有四条SQL语句,那么为什么不尝试将它们组合成一条SQL语句呢?这是邮报上说的吗?这是一个可靠的方法吗

我在考虑将业务逻辑偏移到存储过程中 特定数据库。因此,如果逻辑是所有外部对象的通用逻辑 然后数据库将其保存在应用程序(.NET)中。如果逻辑是 然后创建一个存储过程

这句话引起了我的极大关注。当你说如果逻辑是特定于一个数据库,我想你是指上述十二个数据库中的一个,这是一个设计缺陷。数据库只是信息存储,它们不需要任何“特殊”逻辑来访问它们,而不需要暴露在任何视图结构之外。此外,如果需要以非设置的方式操作数据,则需要将其放入应用程序中。也就是说,当计算可以偏移到应用程序时,不要执行计算

在设计应用程序时,您必须确保不会对数据库进行变形以忽略关系模型。根据我的经验,这是使应用程序变得不可管理和缓慢的最佳方法之一。澄清一下,业务逻辑不应该存在于数据库中,这使得其他人很难使用您的数据。反对这一点的典型论点是,“我是唯一一个使用数据的人”,对此,我认为这是一个糟糕的设计原因

接下来,您应该尝试确定什么在关系(set)模型中实际起作用,并构建一个可以查询该数据的应用程序。而不是构建适合您的应用程序的数据库。也就是说,
SOLID
不适用于关系模型,因为它们不是面向对象的

在计算机编程中,固体(单一责任,开放-关闭, Liskov替换、界面分离和依赖项倒置) 是Michael Feathers为“第一个”引入的助记首字母缩写词 罗伯特·C·马丁[2]在20世纪早期提出的“五项原则” 2000年[3]代表面向对象的五个基本原则 编程和设计

根据评论更新


该应用程序链接来自不同系统的信息并决定 当可以删除一组记录时(这些是 适用于所有系统)。然后有一些特定于数据库的规则 必须在删除之前应用。我在考虑抵消 存储过程的本地业务规则

看了这篇评论,我不完全理解除了审核/软删除之外,还有哪些特定于数据库的规则。我同意可以将特定于数据库的
规则设置为数据库中的管理存储过程,您必须在遇到以下问题时划定界限:

我的应用程序根据历史数据进行查询,除非历史数据早于
6个月
,否则必须从脱机存储中检索历史数据

6个月后删除此数据时,您可以选择允许应用程序通过某些业务逻辑清除它,或者创建一个计划任务来执行此清除,因为删除元组是一项正常的数据库操作

我在这里的论点是将其放在数据库中,并禁止应用程序调用这些过程。事实上,您的应用程序甚至不应该知道数据库存在于正确抽象的应用程序中。因此,如果这是您提出的示例,那么我的解决方案如下:

1) Create stored procedures in the database that only a maintenance based user can invoke,   NOT THE APPLICATION  
2) Create a database scheduled task to run these based on your data needs.  

我同意不将业务逻辑放入SQL的概念,也同意SQL是基于集合的语言的概念

将SOLID视为一些真正优秀编程实践的特定于OO的实现,并将它们应用于您编写的任何代码,包括SQL。好的表格模式设计将融入坚实的理念

我花了太多的时间调试大型复杂存储过程,所以如果您可以避免,请这样做。如果您必须编写存储过程代码,那么SOLID可以帮助您

例如,我有一个大型存储过程,它查询几十个表,并返回一个数据集供打印机发送“欢迎信”。这是一个伪装成“报告”并用SQL编写的业务流程的经典示例

从实心透镜看此操作: 它应该有一个单一的责任和一个改变的理由。 代码既决定了谁得到一个字母,也决定了该字母中包含哪些数据。如果流程的任一方面发生更改,则必须更新并重新测试整个系统。一个可靠的原则是要有一个函数来确定谁得到一个字母以及字母中的内容

这可以是一个简单的查询,它将返回一个客户列表。将其作为ID或TVP数组馈送到另一个存储过程中以收集数据

打开/关闭 在大多数SP(存储过程)代码中,整个过程要么是硬编码的,要么是“数据驱动的”。数据驱动通常是违背这一原则的SQL努力。SQL流由案例透视修改