Эффективный алгоритм для связи Obj1 с Obj2 на основе набора правил - PullRequest
0 голосов
/ 02 января 2012

У меня есть таблица, содержащая миллионы записей транзакций (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 Ответ

1 голос
/ 04 января 2012

Итак, ваша настоящая проблема в том, как быстро сопоставить транзакции с потенциальными правилами.Вы можете сделать это с помощью инвертированного индекса, который сообщает, какие правила соответствуют определенным значениям атрибутов.Например, предположим, у вас есть эти три правила:

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

Затем вы обрабатываете эти выходные данные (или можетесделайте это, пока вы обрабатываете правила) и создайте три таблицы.Одна отображает значения страны в правила, одна отображает значения состояния в правила, а другая отображает значения ZIP в правила.В итоге вы получите что-то вроде:

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

Значение "*" - это "все равно", которое будет соответствовать всем правилам, в которых не указано это поле.То, требуется ли это, зависит от того, как вы структурировали свои правила.

Приведенные выше индексы создаются при каждом изменении ваших правил.С 4000 правилами это не должно занимать какое-то время вообще, а размер списка не должен быть очень большим.

Теперь, учитывая транзакцию со значением Country "USA", вы можете посмотреть втаблица Стран, чтобы найти все правила, которые упоминают эту страну.Назовите этот список Country_Rules.Сделайте то же самое для штатов и почтовых индексов.

Затем вы можете сделать пересечение списка.То есть создайте еще один список с именем Country_And_State_Rules, который содержит только те правила, которые существуют в списках Country_Rules и State_Rules.Обычно это будет небольшой набор возможных правил.Затем вы можете просмотреть их один за другим, тестируя страну, штат и почтовый индекс, как требуется.

То, что вы создаете, - это, по сути, поисковая система для правил.Это должно позволить вам очень быстро сузить кандидатов от 4000 до нескольких человек.

Есть несколько проблем, которые вам придется решить.Наличие условной логики («ИЛИ») немного усложняет ситуацию, но это неразрешимо.Кроме того, вы должны определить, как справиться с неоднозначностью (что, если два правила совпадают?).Или, если никакие правила не соответствуют конкретной стране и штату, необходимо выполнить резервное копирование и проверить правила, которые соответствуют только стране ... или соответствуют только штату.Вот тут и появляется «все равно».

Если ваши правила достаточно однозначны, то в подавляющем большинстве случаев вы сможете выбрать соответствующее правило очень быстро.В некоторых случаях вам придется искать множество различных правил для некоторых транзакций.Но эти случаи должны быть довольно редкими.Если они частые, то вам нужно пересмотреть свой набор правил.

Как только вы узнаете, какое правило применяется к конкретной транзакции, вы можете легко узнать, какой продавец получает, сколькохранится с правилами.

...