2011-07-29 58 views
4

我使用SQL Server 2005的数据驱动的业务规则。

我有一个表

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 

现在什么我试图做的是存储所有这些数据库中的规则并使其数据驱动。其原因是为了给最终用户更多的灵活性。如果明天业务规则发生变化,最终用户可以灵活地通过GUI进行更改。例如。如果明天企业想要将比较值从126改为200,他们应该可以通过界面改变它。尽可能我试图给灵活性,像改变列的能力一样,业务应该能够改变规则,而不是col1,他们可以将新规则更改为col2。如果可能的话,他们也可以改变操作员而不是> =他们可以将其更改为< =。

我想改变它更多的数据驱动,所以当表中的值发生变化时,我们不需要更改代码。

是否有可能在数据库中做这件事?有人可以建议支持这个业务规则的数据模型是数据驱动吗?

+2

Bevare的内平台反模式。 http://en.wikipedia.org/wiki/Inner-platform_effect – Guffa

回答

8

不要在数据库中存储代码。数据库用于数据。代码是用于代码的。

请参阅Inner-Platform Effect反模式。

Maaaybe您可以在数据库中存储像126和200这样的值,但我会将它们放在配置文件中。但一旦用户需要这么大的灵活性,你必须为他们设计一个数据驱动的业务规则引擎,你就完全重新发明了轮子。

它会成为你的噩梦在以下几个方面:

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

更新:有业务规则的平台,如Drools,但这些都应该有自己的执行业务规则的语言。 SQL不是最好的语言。

+0

我认为你是对的。谢谢。 – niceApp

+0

不是Drools(规则引擎)本身就是内部平台反模式的一个例子。 en.wikipedia.org/wiki/Inner-platform_effect? 。请参阅此问题:http://stackoverflow.com/questions/18359590/data-driven-rules-engine-drools – Jasper

+0

@贾斯珀,我没有看到与Drools的连接。这是一个关于在Microsoft SQL Server中实现一种规则引擎的问题。 –