0

我正在尝试在 Oracle 表上应用一些业务规则(包含和排除规则)并根据规则更新状态列。稍后将根据状态列的值从该表中提取文件。现在企业想要使用 UI 配置规则。所以规则将是动态的。

我计划在临时表中存储用户可能希望使用业务规则的所有可能列。在规则 UI 中,将显示此临时表中的所有列。然后我打算创建一个存储过程来从规则表中获取规则并使用动态更新语句来更新状态列。动态 SQL 会对此有好处吗?

规则表:

Id、RuleName、RuleDesc、ColumnName、运算符、值、连接器、ConnectOperator、RulePrecedence

连接器 - 要连接到规则说

#1 Code=1001
#2 state='FL' 

在第一条规则中,用户可以将 #2 作为 Connector 并且 ConnectOperator 可以是“和/或”

或者我可以使用 C# 代码,将表中的所有行提取到对象中,然后使用 LINQ 查询根据规则过滤行并更新表。也许使用 NHibernate 作为 ORM,因为 Oracle 是底层数据库。但不确定Oracle的性能是否会好。要处理的行数可以在 500K 左右

我也很困惑,如果数据库将是存储规则的最佳位置,或者还有其他方式,但可以肯定的是用户想要配置和创建规则,并且规则可以引用可能属于不同表的列(这就是我想要的原因将所有可能的列存储在暂存表中,尽管我知道它有限制,如果业务想要在此暂存中不存在的列上创建规则,那么此架构将不起作用)

有什么建议我应该如何处理这个设计?

4

2 回答 2

1

我继续将规则存储在数据库表中,并使用存储过程和动态 sql 在运行时执行它们。我需要对 sql 查询进行一些性能调整,现在它工作正常。我能够在 45 分钟内处理 64 百万条记录,这还不错。我使用基于集合的操作(更新语句)进行规则处理。

于 2013-05-29T14:04:14.220 回答
0

有很多方法可以解决这个问题,没有标准的解决方案。如果你用谷歌搜索“规则引擎”和“ETL”,你会发现很多人都在展示他们的解决方案。

我发现的最灵活的解决方案将图形 ETL 工具与现有规则引擎集成在一起。这利用了现有产品,使流程的双方保持良好的分离和灵活性。即使它们向规则引擎提供单行,它们也报告了足够好的性能。

在 C# 或 Java 中评估规则的主要优点是您可以使用标准规则引擎。因此,您可以免费获得规则引擎附带的所有语法糖和图形编辑。您的业​​务可能会在规则方面变得疯狂,您甚至不会注意到。

我建议不要使用 ORM 工具来获取和更新数据。更新状态列所需的信息应该存在于同一行中,因此不需要 ORM 工具。一个简单的数据集应该就可以了。

作为一个疯狂的事后思考:Oracle 已经尝试使用 Java-in-the-database,所以也许您甚至可以让 Java 规则引擎在您的数据库中运行?

于 2013-02-01T12:14:20.473 回答