【问题标题】:Execute business rules dynamically on an Oracle table在 Oracle 表上动态执行业务规则
【发布时间】:2013-01-30 19:07:17
【问题描述】:

我正在尝试在 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左右

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

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

【问题讨论】:

  • 您是否考虑过将他们指向现成的图形 ETL 产品,例如 Microsoft SSIS 或 Oracle Warehouse Builder?
  • 你想如何使用 SSIS 呢?从临时表中获取所有行,然后使用脚本组件处理每一行?如果是 Oracle,那么我们可以使用 Informatica。性能会更好。但不确定 Informatica 是否有任何脚本组件。
  • 性能不错,没错,没错。由于目标是提取文件,因此您可以包含该步骤。在我最了解的 SSIS 中,您可以使用图形编辑器配置转换和过滤器,该编辑器可以可视化转换块之间的数据流。它使用 .Net 数据库连接,因此连接到 oracle 应该足够顺利。
  • 还不知道 Informatica,但在我找到的网页上看起来与 ssis 相似。

标签: c# oracle architecture rule-engine business-rules


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我找到的最灵活的解决方案integrates a graphical ETL tool with an existing rules engine。这利用了现有产品,使流程的双方保持良好的分离和灵活性。而且它们报告了足够好的性能,即使它们向规则引擎提供单行。

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多