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

Sql server 业务逻辑放在哪里?在VB.Net中?还是用SQL?,sql-server,vb.net,Sql Server,Vb.net,我正在创建一个允许我创建计划任务的应用程序。我有一个线程化进程,每分钟都在后台运行,并触发以下类: Namespace MyName.space Public Class RunJob ... End Class End Namespace 作业可以是“运行一次”或“重复” 我在vb.net中查询作业表,将结果存储在数据集中,以便一次迭代一个。然后,我开始考虑根据作业的唯一标准来验证作业是否应该运行的函数 例如,最简单的是“运行一次”作业: 该函数将检查“WhentRun”是否在服

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

Namespace MyName.space
  Public Class RunJob
  ...
  End Class
End Namespace
作业可以是“运行一次”或“重复”

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

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

该函数将检查“WhentRun”是否在服务器上配置的当前日期和时间的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'
然后我开始思考,我应该用并集或联接来执行我的所有逻辑,还是在重复的工作上执行复杂的WHERE/和/或条件?他们变得更复杂了。。。例如每周、一周中的哪几天、什么时间等,或者在月的最后一天的“一月、三月等”中每隔“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代码中抽象出一些复杂性,并将代码库缩小一点(有些人可能会认为这是一件坏事)。如果存在需要修复的bug,重新部署存储过程(或用户定义的函数、视图等)通常比重新部署应用程序(尤其是涉及多个工作站的应用程序)更容易。另一方面,其他人很容易看到(窃取!)您的代码,或者对其进行更改


一般来说,业务逻辑越复杂,我就越有可能把它放到应用程序中。如果它很简单,不太可能改变,我会考虑把它放到TSQL中。也就是说,如果我必须毫无例外地选择其中一个,我会把BL放在应用程序中。

喜欢这个答案。。。有助于澄清我的想法和决定。非常感谢。
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