sql-server - 业务逻辑放在哪里?在 VB.Net 中?还是用SQL?

标签 sql-server vb.net

我正在创建一个应用程序,允许我创建计划任务。我有一个线程进程,每分钟在后台运行,并触发以下类:

Namespace MyName.space
  Public Class RunJob
  ...
  End Class
End Namespace

作业可以是“运行一次”或“重复运行”。

我正在 vb.net 中查询作业表,将结果存储在数据集中,以便我可以一次迭代一个结果。然后我开始考虑函数来验证作业是否应该根据其独特的标准运行。

例如,最简单的是“运行一次”作业:

If Type = "Run Once"
    JobShouldRun = Helpers.Validate_RunOnce(WhenToRun, RunCount)
ElseIf Type = "Recurring"
    ...
End If

该函数将检查“WhenToRun”是否在服务器上配置的当前日期和时间的 5 分钟内。我选择了 5 分钟的窗口来防止任务失败,这样一分钟后它就会重试,并且还剩下 3-4 次尝试。

但后来我开始认为我可以在 SQL 查询中控制更多的操作来获取作业本身,并跳过在 vb.net 上验证这个“简单”,但我不确定哪种方法更优化。因此,我可以限制在初始查询中开始的结果集:

SELECT
     JobId
    ,JobType -- Run Once or Recurring
    ,WhenToRun

FROM JobTable a
WHERE Active = 1
AND (
      JobType = 'Run Once'
      AND TotalRuns = 0
      AND DATEDIFF(minute, getdate(), a.WhenToRun) BETWEEN 1 AND 5
    )
OR JobType = 'Recurring'

然后我开始思考,我应该使用 UNION 或 JOINS 执行所有逻辑,还是对重复作业执行复杂的 WHERE/AND/OR 条件?它们变得相当复杂......例如每周以及一周中的哪几天以及什么时间等。或者“Jan|March|Etc”中的每个“int”年在该月的最后一天。

所以我开始沿着这些思路思考:

SELECT 
     JobID
    ,JobType
    ...
FROM JobTable 
WHERE RecurringType = 'Weekly'
AND ... more conditions based on all the custom job settings

UNION ALL

SELECT
     JobID
    ,...
FROM JobTable 
WHERE RecurringType = 'Monthly'
AND ... more conditions based on all the custom job settings

这个查询最终会变得相当大和复杂,但我的问题是,我应该在 vb.net 或 SQL 中处理这个问题,还是在 SQL 中处理简单的内容,在 vb.net 中处理更复杂的条件?我不确定这两个方向对性能的影响。

最佳答案

您基本上是在问“我应该在哪里放置业务逻辑代码?在应用程序中?还是在数据库中?”这可能是一个备受争议的话题,但考虑这两种选择是明智的。每种方法都需要权衡,并且说一种方法是正确的而另一种方法是错误的似乎有点傲慢。

如果您的 BL 代码位于应用程序中,您将获得 .Net Framework 的稳健性的主要优势。我喜欢 tsql,但你不能用它做与 VB.Net 一样多的事情。如果我可以对开发人员进行刻板印象,我怀疑他们通常会更喜欢 .Net 代码。对于大多数人来说,它可能比 tsql 更容易调试。由于 .Net 代码被编译为程序集,因此也不太可能被更改。

如果你的BL代码在tsql中,你可能会发现性能好一点。您还可以从 .Net 代码中抽象出一些复杂性,并使代码库变得更小(有些人可能会认为这是一件坏事)。如果存在需要修复的错误,重新部署存储过程(或用户定义的函数、 View 等)通常比重新部署应用程序更容易(特别是在涉及多个工作站的情况下)。不利的一面是,其他人很容易看到(窃取!)您的代码,或对其进行更改。

作为一般准则,业务逻辑越复杂,我就越有可能将其放入应用程序中。如果它非常简单并且不太可能改变,我会考虑将其放入 tsql 中。话虽这么说,如果我必须毫无异常(exception)地选择其中之一,我会将 BL 放入应用程序中。

关于sql-server - 业务逻辑放在哪里?在 VB.Net 中?还是用SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28198268/

相关文章:

vb.net - MessageBox 与 YesNoCancel - 否和取消触发相同的事件

sql - 使用非聚集索引时,我的 SQL 查询花费的时间太长

sql - 通过连接和计数对多列进行排序

c# - 在特定位置插入 XML 节点

vb.net - vb.net中的MsgBox()和MessageBox.show()有什么区别

Javascript循环逻辑不正确

sql - 最常见的单词/字符组合 SQL Server

SQL Server SET DATEFIRST 范围

sql - Varchar 对 Sum 运算符无效

C# > VB 转换,RelayCommand 的行为不同