Разработка управляемой данными логической системы - PullRequest
4 голосов
/ 13 февраля 2012

Я разрабатываю систему расчета налогов, которая применяет различные налоги на основе набора предоставленных критериев.
Информация часто меняется, поэтому я пытаюсь создать способ хранения всех этих логических правил в базе данных.

Как вы можете себе представить, в применении налогов много сложной логики.
Например, налог может применяться только , если A истинно, B меньше 100, а C равно 7 .

Мой нынешний дизайн ужасен.
У меня есть несколько столбцов базы данных для очень общих критериев фильтрации, таких как местоположение и налоговый год.
Для более сложной логики у меня есть столбец с JavaScript, а в коде я запускаю интерпретатор для фильтрации результатов. Производительность и ремонтопригодность отстой.

Я бы хотел улучшить эту конструкцию, сделав логику полностью управляемой данными, но у меня возникают проблемы с поиском правильного представления этой логики в реляционной базе данных. Что является хорошим способом для моделирования этой логики в базе данных?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Я работал над этой аналогичной проблемой уже более года для приложения для создания производственных затрат.Точно так же он принимает множество входных данных о дизайне продукта и основывается на дизайне, а также других вопросах инвентаризации, таких как количество, варианты оптовых закупок, поставщик деталей, электрические характеристики и т. Д. В результате получается список прямых материалов, рабочей силы и затрат.

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

МЕТОД 1 - SQL Я создал таблицы, представляющие мои объекты, и столбцы, представляющие свойства, а затем вручную ввел все необходимые для SQL SELECT инструкции.в таблице item_rules.Я сначала сохранил объект в базе данных, а затем

rules = SELECT * FROM item_rules
foreach(rules as _rule)
{
   count = SELECT COUNT(*) FROM (_rule[select_statement]) as T1
   if(count > 1) itemlist.add(_rule[item_that_satisfy_rule])
}

Он берет каждое правило в таблице item_rules и запускает его для моего объекта, который сейчас находится в таблицах.,например, SELECT * FROM my_object, где A = 5 и B> 10.Если я успешно его заберу, то получу положительное число, а затем знаю, что должен включить соответствующий элемент правила в список своих предметов.

МЕТОД 2 - NCALC Вместо хранения запросов вВ формате SQL я нашел библиотеку синтаксического анализа выражений с открытым исходным кодом NCALC.NCALC принимает строковое выражение и переменную параметра и вычисляет результат.Строковые выражения могут храниться в виде простого текста в файловой системе.

МЕТОД 3 - EXCEL EXCEL на самом деле является очень хорошим программным обеспечением для поиска данных.Вы можете создавать формулы в Excel, а затем передавать данные из своего приложения в Excel, а затем позволить Excel запускать формулы для получения результатов.Преимущество состоит в том, что многие люди знают, как использовать Excel, поэтому разные люди могут поддерживать его.

Но, как я уже сказал, ни один из них не идеален для меня.Я просто делюсь, и, надеюсь, мы сможем получить лучшие рекомендации.

0 голосов
/ 14 февраля 2012

Если вы хотите придерживаться подхода Джейка, вы также можете использовать Dynamic Sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...