Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 数据驱动的业务规则。_Sql Server 2005_Database Design_Business Rules - Fatal编程技术网

Sql server 2005 数据驱动的业务规则。

Sql server 2005 数据驱动的业务规则。,sql-server-2005,database-design,business-rules,Sql Server 2005,Database Design,Business Rules,我正在使用SQLServer2005 我有一张桌子 table1(ID,col1,col2,col3,col4); 现在我有一个业务逻辑,如: If col1 >= 126 and col2 > 1 then col3 = 0 if col1 >=126 and col2 < 1 then col3 = col1+col4 如果col1>=126且col2>1,则col3=0 如果col1>=126且col2=他们可以将其更改为不在数据库中存储代码。该数据库用于存储数

我正在使用SQLServer2005

我有一张桌子

table1(ID,col1,col2,col3,col4);
现在我有一个业务逻辑,如:

If col1 >= 126 and col2 > 1 then col3 = 0
if col1 >=126 and col2 < 1 then col3 = col1+col4
如果col1>=126且col2>1,则col3=0
如果col1>=126且col2<1,则col3=col1+col4

现在我要做的是将所有这些规则存储在数据库中,并使其成为数据驱动的。这样做的原因是给最终用户更多的灵活性。如果明天业务规则发生更改,最终用户可以灵活地通过GUI进行更改。例如,如果明天业务部门希望将比较值从126更改为200,他们应该能够通过接口更改该值。我尽可能地给予灵活性,比如更改列的能力,就像业务部门应该能够更改规则一样,这样他们就可以将新规则更改为col2,而不是col1。如果可能,他们也可以更改运算符,而不是>=他们可以将其更改为不在数据库中存储代码。该数据库用于存储数据。代码就是代码

请参阅反模式

Maaybe您可以将126和200之类的值存储在数据库中,但我会将它们放在配置文件中。但一旦用户需要如此大的灵活性,以至于你不得不为他们设计一个数据驱动的业务规则引擎,你就完全是在重新发明轮子

从以下几个方面来说,这将是你的噩梦:

  • 安全风险,因为用户指定的表达式为代码注入攻击创造了机会
  • 可测试性,因为如果规则引擎包含构造性语法,则无法预测操作范围
  • 性能,因为用户将添加大量的任意表达式和排序条件,而这些表达式和条件在服务器上运行之前不会经过性能测试和优化
  • 维护,因为用户将习惯于他们可以做任何事情的想法,但他们可以想象报告比您编写业务规则要复杂得多


更新:有一些业务规则平台,如,但它们应该有自己的语言来执行业务规则。SQL不是实现这一点的最佳语言。

Bevare内部平台反模式。Drools(规则引擎)本身不是内部平台反模式的一个例子吗。en.wikipedia.org/wiki/internal-platform_effect。请看这个问题:@Jasper,我看不到与口水有关。这是一个关于在Microsoft SQL Server中实现一种规则引擎的问题。@bill karwin你的看法?@Jasper,我不知道昨天是否是你对这个问题投了反对票,但如果是,那不是鼓励我回答你新问题的最佳方式。请记住,StackOverflow上的人们自愿花我们的时间来帮助您。不管怎样,我已经贴出了一个关于你的另一个问题的答案。