【问题标题】:Using Stored Procedures as the Business Logic Layer使用存储过程作为业务逻辑层
【发布时间】:2011-03-18 17:29:17
【问题描述】:

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

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

我工作场所的“最佳实践”有误吗?还是我只是想多了?

【问题讨论】:

  • 您能举出任何示例来说明委派给 MSSQL 的那种逻辑吗?
  • OR/M 框架可以处理存储过程之间的那些层,因此如果您使用它们,您可能会在存储过程中发现更多的业务逻辑,并且中间层更干净。
  • 你熟悉MVC吗?
  • @OMGPonies - MVC 提供了一个你的层应该是什么样子的模型,而不是它们所在的位置。 MVC 中的 M 可以像你想象的一样薄(或者在仍然符合原则的情况下可能根本不存在于应用程序中)。我最初的反应是相似的,但您需要牢记“地点”可能对项目产生的重要性和影响。

标签: sql-server stored-procedures


【解决方案1】:

GaiusSensei - 只要业务领域能够应对业务实践中的巨变,以这种方式工作就完美了。我认为 SP 和 BLL dll 之间的争论仍然很普遍,毫无疑问,在这个线程中双方都会有很多。然而,根据我自己在过去 10 年的一系列项目中的经验,以下是我支持 BLL dll 方法的观察结果:

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

列表还在继续,但这些是我采用 BLL 方法的首要优点。

期待这一次的许多旋转:)

吉姆

[编辑] - 我还要补充一点,这个 BLL 也不应该发出任何 UI 信息,除了(正如你提到的)传达事件等每个 UI 层(与目标设备相关 - 浏览器/移动设备/ factory) 应该引用 BLL 并用数据做它自己的“thang”。我还要补充一点,在 BLL 下方将是您的 DAL 层。该层可被视为与底层数据存储的 1-1 引用。

【讨论】:

  • DAL 层是拥有数据存储接口的好方法,它使单元测试变得非常容易!另外,您可以将业务逻辑与对象(去)水合逻辑分开。
  • 另外一点,总的来说,我发现在存储过程中用于开发和测试业务逻辑的可用工具比在 Java/C# 等中更加原始和有限。
【解决方案2】:

我们这样做。

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

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

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

【讨论】:

  • "使用预定软件以外的程序连接到数据库" 这是一个很好的观点,当报告团队希望能够报告“来自系统的客户端搜索”时,他们可能会有些疯狂返回搜索所需的业务逻辑。根据我的经验,在程序集中分离为 BLL 有助于可维护性和支持。
【解决方案3】:

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

最佳实践被高估并随着时间而改变。如果他们正在做的事情有效并且他们对此感到满意,那么就没有什么可以做的了。

我无法告诉你我参与了多少个项目,新人加入并认为当前的架构需要改变。我自己做过几次。这不是一个好地方。现状将与你战斗到底。如果您真的打算改变当前的系统,请建立一些信誉。在 3 到 6 个月内开始提出更好的方法来处理一些现有的基础设施。如果你真的不喜欢当前的架构,那就离开公司。

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

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

【讨论】:

  • @M.Babcock 这是关键,愿意改变。根据我的经验,大多数公司都有既定的流程,无论好坏,都没有时间或不想重新审视以前做出的决定。
【解决方案4】:

(我加了“主观”标签)

我更喜欢使用存储过程,除了在我推出的小型应用程序中,因为处理存储过程需要一些额外的时间。

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

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

【讨论】:

  • 在 sql 中单元测试很容易。只需要考虑一下。回到所有花哨的 IDE 之前的过去。
【解决方案5】:

视情况而定。

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

某些事情需要在数据库中强制执行——尤其是任何其他进程将对数据库呈现的性质进行假设的任何事情。

如果数据库的所有用户都假设当帐单方的最后一个后代被停用时,帐单方状态需要更改,那么这需要在数据库中强制执行 - 或者在 SP 中,这是唯一的方法执行操作或触发器,或约束或其他东西。就是这种东西——低级业务逻辑,它是业务级别上真正关键的数据完整性逻辑——在数据库中是可以的。

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

区别很微妙,这就是人们在数据库中处理“业务”逻辑时遇到困难的原因。我只建议在数据库中实现假设数据库保护并在数据库周边呈现给所有数据库用户的东西——这个业务逻辑位于 DAL 层之下,是基本数据库设计的一部分。在传统架构中,我仍然提倡在此之上使用业务盲 DAL,在此之上使用真正的 BLL。

话虽如此,当 DAL 真的是微不足道的 SP 泵送时,当然有可能在数据库中也有您的更高级别的业务逻辑,而当您这样做时,不清楚哪些是低级的,哪些是低级的是高级别的(除非你有两个数据库,一个建立在另一个之上——这不一定是一个糟糕的主意)。您已经用 SQL 而非传统的客户端应用有效地编写了部分业务逻辑。

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

【讨论】:

  • 真的很难说出你的实际建议(也许只是我不同意你的最后几点)。
  • @M.Babcock 我的意思是你有层次。如果您只有表,那么您的数据库将无法保证太多。添加约束,你会得到更多。在某些时候,您有一个边界——也许它就 SPs 而言——它定义了一个数据库接口。如果这必须提供某些保证,那么内部的逻辑可能会被视为业务逻辑,并且可以将其放在数据库中。或者,当数据库不必保证某些东西时,那么在更高的边界上就可以了。这些在任何系统中的位置都可能非常不同。
  • @M.Babcock 因为 OP 没有提供足够的细节,所以它是否是最佳实践的答案是它取决于它,它所依赖的是查看实际层以及它们正在做什么。
  • @M.Babcock 即拥有一个恰好用 SQL 编写的业务逻辑层并不比用任何其他语言编写的更好或更差。重要的是它在哪里运行、它如何扩展、哪些数据在层之间传输以及边界是否合理或事物是否紧密耦合。您当然可以在一个单独的数据库中使用 SQL 中的业务层(高级处理),该数据库依赖于具有自己边界的基本数据库,并且本质上并没有错。
【解决方案6】:

我会说存储过程不适合进行单元测试和重构,就像 .net/java 中的业务层逻辑一样。我会尽可能地将逻辑排除在数据库之外,主要的例外是固有的基于设置的操作,其中 DBMS 会表现出色。

【讨论】:

    【解决方案7】:

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

    我过去常常在带有大型机的客户端服务器系统上工作,在这些系统中,您可以真正实现三层分离和真正的僵化。现代应用程序需要在实现上更加开放,并且在所有层都有业务规则,尤其是用于验证的规则。这并不意味着您的设计模型不能分离,只是必须在 UI、业务层和数据之间实施诸如“空白或星期几”之类的业务规则。

    如果你有什么工作,只需弄清楚如何使用它。

    【讨论】:

      【解决方案8】:

      如果您的同事想通过 MySQL 重用您的业务层怎么办?你会告诉他这是不可能的,因为某些业务层驻留在 SQL Server 中..

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2013-01-10
        • 2015-06-30
        • 2011-06-08
        • 2010-12-18
        • 2013-05-18
        • 2018-04-17
        • 2017-11-07
        • 2011-03-29
        相关资源
        最近更新 更多