Я работаю над проектом, в котором нам нужно будет определить определенные типы статусов для большого количества людей, хранящихся в базе данных. Бизнес-правила для определения этих статусов довольно сложны и могут измениться.применение бизнес-правил на уровне базы данных
Например,
if a person is part of group X
and (if they have attribute O) has either attribute P or attribute Q,
or (if they don't have attribute O) has attribute P but not Q,
and don't have attribute R,
and aren't part of group Y (unless they also are part of group Z),
then status A is true.
Multiply несколько десятков состояний и, возможно, сотни групп и атрибутов. Люди, группы и атрибуты находятся в базе данных.
Хотя это будет использовано Java-приложением, мы также хотим иметь возможность запускать отчеты непосредственно с базой данных, поэтому было бы лучше, если бы набор вычисленных статусов был доступен на уровне данных.
Наш текущий план проектирования должен состоять из таблицы или представления, состоящего из набора булевых флагов (hasStatusA? HasStatusB? HasStatusC?) Для каждого человека. Таким образом, если я хочу запросить всех, у кого есть статус C, мне не нужно знать все правила вычисления состояния C; Я просто проверяю флаг.
(Обратите внимание, что в реальной жизни флаги будут иметь более значимые имена: isEligibleForReview ?, isPastDueForReview ?, и т. Д.).
Итак, а) это разумный подход, и б) если да, то каков наилучший способ вычисления этих флагов?
Некоторых вариантов мы рассматриваем для вычислительных флажков:
сделать набор флагов представления, и вычислить значение флагов из основных данных в режиме реального времени с использованием SQL или PL-SQL (это Oracle DB). Таким образом, значения всегда точны, но производительность может пострадать, и правила должны поддерживаться разработчиком.
Сделать набор флагов состоящий из статических данных и использовать механизм некоторых типов правил, чтобы эти флагов обновлялись по мере изменения базовых данных. Таким образом, правила могут поддерживаться более легко, но флаги могут быть неточными в данный момент времени. (Если мы идем с этим подходом, есть правила двигатель, который может легко манипулировать данные в базе данных таким образом?)
Как часто обновляются ваши данные? Мы говорим, что этот статус может меняться каждую минуту, час, день, неделю? – JNK
Ваш пример читается как Пролог. – Dave
Атрибуты могут меняться ежедневно; групп, возможно, ежемесячно. Статусы в идеале должны быть точными в течение минуты или около того относительно изменения атрибута. Сами правила должны меняться реже; может быть, каждые несколько месяцев. –