基于规则集将Obj1与Obj2关联的高效算法

时间:2012-01-02 19:50:06

标签: algorithm rule-engine

我有一个包含数百万个交易记录(Obj1)的表,看起来像这样

TransactionNum  Country   ZipCode State    TransactionAmount
1               USA        94002   CA         1000
2               USA        00023   FL         1000

我有另一个包含Salesreps记录(Obj2)的表,再次成千上万。

SalesrepId   PersonNumber     Name
Srp001          123           Rohan
Srp002          124           Shetty

我有一些规则集表,其中基本规则定义如下

  • 规则名称:规则1
  • 资格标准:国家=“美国”和(ZipCode = 94002或州=“FL”)
  • 信用接收销售额:
    • Srp001获得70%
    • Srp002获得30%

合格标准适用于交易,这意味着如果交易属性与规则中的条件匹配,则会将信用分配给规则的信用接收方部分中定义的销售额。

现在,我需要一个算法来填充结果表,如下所示

ResultId TransactionNumber SalesrepId  Credit
1        1                 Srp001        700
2        2                 Srp002        300

执行此操作的有效算法是什么?

1 个答案:

答案 0 :(得分:1)

所以你真正的问题是如何快速地将交易与潜在规则相匹配。您可以使用反向索引来执行此操作,该索引说明哪些规则与属性的特定值匹配。例如,假设您有以下三条规则:

Rule 1: if Country = "USA" and State = "FL"
            S1 gets 100%
Rule 2: if Country = "USA" and (State = "CO" or ZIP = 78640)
            S2 gets 60%
            S3 gets 40%
Rule 3: if Country = "UK"
            S3 gets 70%
            S2 gets 30%

现在,您处理规则并创建如下输出:

Country,USA,Rule1
State,FL,Rule1
Country,USA,Rule2
State,CO,Rule2
ZIP,78640,Rule2
Country,UK,Rule3

然后处理该输出(或者您可以在处理规则时执行此操作)并构建三个表。一个将Country值映射到规则,一个将State值映射到规则,一个将ZIP值映射到规则。你得到的结果如下:

Countries:
    USA, {Rule1, Rule2}
    UK, {Rule3}
States:
    FL, {Rule1}
    CO, {Rule2}
    "*", {Rule3}
ZIP:
    78640, {Rule2}
    "*", {Rule1, Rule3}

“*”值是“不关心”,它将匹配所有未明确提及该字段的规则。是否需要这取决于您如何构建规则。

只要规则发生变化,就会构建上述索引。有4000条规则,它根本不需要任何时间,列表大小不应该很大。

现在,给定一个国家/地区值为“USA”的交易,您可以查看“国家/地区”表格以查找提及该国家/地区的所有规则。调用该列表Country_Rules。为州和邮政编码做同样的事情。

然后,您可以执行列表交集。也就是说,构建另一个名为Country_And_State_Rules的列表,该列表仅包含Country_RulesState_Rules列表中存在的那些规则。这通常是一小组可能的规则。然后,您可以逐个浏览它们,根据需要测试国家/地区,州和邮政编码。

您正在构建的内容本质上是规则的搜索引擎。它应该允许你很快将候选人从4,000缩小到屈指可数。

您需要解决一些问题。使用条件逻辑(“OR”)会使事情变得复杂,但这并不棘手。此外,您必须确定如何处理歧义(如果两个规则匹配会怎么样?)。或者,如果没有规则与特定国家/地区匹配,则必须备份并检查仅与国家/地区匹配的规则...或仅匹配状态。这就是“不关心”的地方。

如果您的规则足够明确,那么在绝大多数情况下,您应该能够非常快速地选择相关规则。有些情况会要求您为某些交易搜索许多不同的规则。但这些案件应该非常罕见。如果它们很频繁,那么您需要考虑重新检查您的规则集。

一旦您知道哪条规则适用于特定交易,您就可以轻松查找哪个销售人员获得了多少,因为比例与规则一起存储。