我已经阅读了很多articles关于为什么我们不应该在几个地方拥有业务逻辑,但尝试将其保留在BLL代码中。我理解易于维护的重点,更清楚地了解代码的作用。
但是,我从未发现任何解释,在将某些业务规则应用(重复)到存储过程会显着减少从数据库到客户端应用程序的数据传输时,我们应该怎么做?
例如,我目前正在使用较长时间的一些统计数据。目前,所有业务逻辑/规则都在商业逻辑层(dll)中。用户可以选择在月份级别上显示一年的某些结果。这意味着,如果我不在存储过程中使用业务规则,我将需要返回大约1,000,000条记录,然后在客户端将业务规则应用于此记录。但是,如果我要将业务规则应用于存储过程,那么它会将返回的记录数减少到12个。
应用业务规则的示例如下所示:
AVG(CASE WHEN Field1 IS NULL
THEN CASE WHEN c.Field2 = 1
THEN ( cap1.Field3 / cap1.Field4) * 60
ELSE CASE
..... etc
所以这不是一个简单的逻辑,而是一个复杂的逻辑。并且由于这种逻辑可以在许多不同的存储过程中重复,这将成为数据库中单独函数的候选者,以避免重复代码。
那么,推荐的方式是什么? 为什么?
答案 0 :(得分:0)
也许你仍然可以拥有它所属的商业逻辑,并将这些东西归类为更多"计算&#34 ;?
无论哪种方式,当你达到一百万行时,你有一个令人信服的理由在数据库层进行计算。所以我会把计算保留在函数中。因此,在您的示例中,将使用可重用函数,如:
SELECT AVG(dbo.fnFieldsEvaluate(Field1, Field2, Field3, Field5)) as FieldAvgs,
...
或者如果它被大量使用,足够简单并且仅取决于单行中的列,则表中的计算列会更方便。
CREATE TABLE dbo.Products
(Field1 ....,
Field2 ....,
RowEvaluatesTo AS CASE WHEN Field1 IS NULL
THEN CASE WHEN Field2 = 1
THEN(Field3 / Field4) * 60
ELSE CASE ...
你的函数dbo.fnFieldsEvaluat(或计算列)将提供计算所在的一个位置。