我正在做一个项目,我们需要确定大量人员的某些类型的状态,存储在数据库中。确定这些状态的业务规则相当复杂,并且可能会发生变化。
例如,
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? 等)。
所以a)这是一种合理的方法,b)如果是这样,计算这些标志的最佳方法是什么?
我们正在考虑计算标志的一些选项:
使标志集成为一个视图,并使用 SQL 或 PL-SQL(这是一个 Oracle DB)从底层数据实时计算标志值。这样,这些值总是准确的,但性能可能会受到影响,并且规则必须由开发人员维护。
使标志集由静态数据组成,并使用某种类型的规则引擎使这些标志在基础数据更改时保持最新。这样可以更轻松地维护规则,但标志可能在给定时间点不准确。(如果我们采用这种方法,是否有一个规则引擎可以以这种方式轻松地操作数据库中的数据?)