使用存储过程作为业务逻辑层

时间:2010-07-20 23:06:20

标签: sql-server stored-procedures

我正在为之工作的公司目前正在使用存储过程(在MsSQL服务器后端)作为其业务逻辑层。实际的业务逻辑DLL只调用sProcs并基本上管理UI(事件,数据绑定等)

我认为设置有问题,但我不确定如何向同事解释。顺便说一下,系统正常工作。

我工作场所的“最佳实践”是错误的吗?或者我只是想过这个?

8 个答案:

答案 0 :(得分:6)

我们这样做。

这是因为我们支持用户使用除预期软件之外的程序(如SQL Management studio,osql和Excel)连接到数据库的场景。

当你直接连接到一个不超过数据存储的数据库时,你可以搞砸一切,因为没有任何规则可以阻止你。这些规则只存在于使用该数据库的程序中,如果您不使用该程序,您可以使用I-can-write-to-table-table权限来执行愚蠢(或有趣)的事情。

如果您只有执行存储过程的权限,则不能 我个人认为这是一种更好的方法。

答案 1 :(得分:6)

GaiusSensei - 只要业务领域能够处理业务实践中的地震变化,就可以以这种方式工作。我认为SP和BLL dll之间的争论仍然存在,毫无疑问,双方在这个问题上会有很多。但是,根据我自己在过去10年中对一系列项目的经验,以下是我支持BLL dll方法的观察结果:

  • BLL中包含的逻辑可以 “不可知”的存储介质和 因此更灵活 (这种情况发生的频率是多少 有争议的)
  • 对业务进行更细致的控制 权限ACROSS的范围 依赖于的应用程序 数据存储。我的意思是核心 必须具有完整性的表 保持在特定的水平 它在企业内部使用 有问题的申请。
  • BLL逻辑可以封装在self中 包含可以重复使用的类 在其他业务领域和/或 项目。班级甚至可以 写作密封的类或 根据您的目标可扩展 '观众'
  • 单元测试 - 这个(在我的 经验)是一种黑色艺术如果使用 在SP的内部。在java / c#等下,这个 是一个标准,有些人会说 现在是强制性的练习。
  • 可维护性。保持良好 BLL dll中组织的接口 方案,你可以轻松搞定 支持开发人员扩展您的 课程没有破坏现有的 逻辑
  • 可移植性。你的BLL(取决于 语言实现)可以 托管在各种平台上。 同样,注射了 数据存储的实现可以 字面上是来自xml的任何东西 文件到mysql,mssql postgres等, 等
  • 标准化。数据架构师 可以准确定义每个数据的方式 元素应该取自 数据库以及每个项目应该如何 保存(因为这将更好地位于DAL dll中)。因此,进入的成本 新开发商以及经验丰富的项目都很多 降低。

列表继续,但是,这些是我采用BLL方法的头顶PROS。

看看这个上的许多旋转:)

吉姆

[编辑] - 我还要补充一点,这个BLL不应该发出任何UI信息,除了(如你所说)传达事件等每个UI层(与目标设备相关 - 浏览器/移动设备/工厂)应该参考BLL并用数据自己做'thang'。我进一步补充说,BLL下面是你的DAL层。可以将此层视为基础数据存储区的1-1引用。

答案 2 :(得分:6)

听起来您的业务层实际上是数据层,而您的应用程序没有业务层,但我离题了......

最佳做法被高估并随时间而变化。如果他们正在做的事情并且他们对此感到满意,那么就没有太多可以做的事了。

我无法告诉你我有多少项目在新人加入的地方并且认为当前的架构需要改变。我自己做了几次。这不是一个好地方。现状将打击你到最后。如果您真的打算改变当前系统,那么建立一些可信度。在3到6个月内开始建议更好的方法来接近一些现有的基础设施。如果你真的不喜欢当前的架构,那就离开公司吧。

该应用程序是用最好的意图编写的。最初的开发人员受到时间,经验和技术的限制。

您所描述的应用程序是成熟的学习机会。注意失败点,从中学习成功。你会惊讶于你学到的东西。

答案 3 :(得分:3)

(我添加了“主观”标签)

我更喜欢使用存储过程,除了我推出的小应用程序,因为搞乱存储过程会花费一些额外的时间。

Christopherous 5000:您仍然可以使用存储过程进行单元测试

我倾向于同意这两个类似问题的答案:

答案 4 :(得分:3)

取决于。

这取决于你所谓的业务逻辑。

某些事情需要在数据库中强制执行 - 尤其是某些其他流程会对数据库所呈现的性质做出假设的任何事情。

如果数据库的所有用户都认为当计费方的最后一个后代被停用时,需要更改计费方状态,那么这需要在数据库中强制执行 - 要么在SP中是唯一的方式执行操作或触发器,约束或某事。这是一种事情 - 低级业务逻辑,它是业务级别的关键数据完整性逻辑 - 可以在数据库中使用。

高级业务逻辑不适合数据库 - 例如,当患者取消其最后一次约会并需要进入召回列表时 - 这不是数据完整性问题 - 系统的所有呼叫者都不会认为没有预约的病人必须在召回名单上。

区别是微妙的,这就是为什么人们在数据库中遇到“业务”逻辑的困难。我建议只假设数据库保护并在数据库外围向数据库的所有用户呈现的内容在数据库中实现 - 此业务逻辑位于DAL层之下,是基础数据库设计的一部分。我仍然在传统架构中提倡一种商业盲目的DAL,而不是那种真正的BLL。

话虽如此,当DAL实际上是微不足道的SP泵送以在数据库中拥有更高级别的业务逻辑时,肯定是可能的,并且当你这样做时,不清楚哪些东西是低级的,哪个是哪个是高级别的(除非你有两个数据库,一个建立在另一个之上 - 这不一定是一个可怕的想法)。您已经在SQL中有效地编写了部分业务逻辑,而不是传统的客户端应用程序。

这并不一定意味着您的图层太紧密耦合或者您的架构很糟糕 - 就像任何系统一样,不同层的语言选择并不一定指向架构问题。只有通过查看图层才能判断出是否存在架构问题。

答案 5 :(得分:2)

我想说存储过程不适合单元测试和重构,就像.net / java中的业务层逻辑一样。我会尽可能地将逻辑从数据库中删除,主要的例外是基于DBMS的优秀操作。

答案 6 :(得分:1)

我认为存储过程可以作为业务逻辑的一部分。我认为你不需要将你的整个业务逻辑放在一个dll中。但是,如果您有一个管理UI的业务层,我认为您需要使用某种框架将UI管理与业务层分开。分离应该是有效的,不要将数据嵌入存储过程或业务逻辑中,反之亦然。我还认为,如果您有其他程序,例如excel或报告,则通过离散数据源,Web服务或其他任何方式访问它们应该进入的数据。

我习惯使用具有大型机的客户端服务器系统,在这些系统中,您可以实现三层的真正分离和真正的骨头不灵活性。现代应用程序需要在实现中更加开放,并且在所有层都有业务规则,尤其是验证。这并不意味着您的设计模型不能分离,只是必须在UI,业务层和数据中实现“空白或星期几”等业务规则。

如果你有什么工作,那就试着如何使用它。

答案 7 :(得分:0)

如果您的同事想要将您的业务层重用于MySQL,该怎么办?你会告诉他这是不可能的,因为一些业务层驻留在SQL Server中。