Я работаю над проектом, в котором нам нужно будет определить определенные типы статусов для большого количества людей, хранящихся в базе данных. Бизнес-правила для определения этих статусов довольно сложны и могут меняться.
Например,
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.
Умножьте на несколько десятков статусов и, возможно, на сотни групп и атрибутов. Все люди, группы и атрибуты находятся в базе данных.
Хотя это будет использоваться приложением Java, мы также хотим иметь возможность запускать отчеты непосредственно в базе данных, поэтому было бы лучше, если бы набор вычисляемых статусов был доступен на уровне данных.
Таким образом, наш текущий план проектирования состоит в том, чтобы иметь таблицу или представление, состоящее из набора логических флагов (hasStatusA? hasStatusB? hasStatusC?) для каждого человека. Таким образом, если я хочу запросить всех, кто имеет статус C, мне не нужно знать все правила для вычисления статуса C; Я просто проверяю флаг.
(Обратите внимание, что в реальной жизни флаги будут иметь более осмысленные имена: isEligibleForReview?, isPastDueForReview? и т. д.).
Итак, а) это разумный подход, и б) если да, то как лучше всего вычислить эти флаги?
Некоторые варианты, которые мы рассматриваем для вычисления флагов:
Сделайте набор флагов представлением и вычислите значения флагов из базовых данных в режиме реального времени, используя SQL или PL-SQL (это Oracle DB). Таким образом, значения всегда точны, но может пострадать производительность, и разработчику придется поддерживать правила.
Сделайте набор флагов состоящим из статических данных и используйте какой-либо механизм правил, чтобы поддерживать эти флаги в актуальном состоянии по мере изменения базовых данных. Таким образом, правила легче поддерживать, но флаги потенциально могут быть неточными в данный момент времени. (Если мы выберем этот подход, существует ли механизм правил, который может легко манипулировать данными в базе данных таким образом?)