我正在开发一个项目,在该项目中,我们需要确定存储在数据库中的大量人员的某些类型的状态。确定这些状态的业务规则相当复杂,可能会发生变化。在数据库级别应用业务规则
例如,
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?等等)。
所以一个),这是一种合理的方法,和b)如果是这样,什么是计算这些标志的最好方法?
我们正在考虑用于计算标志的一些选项:
让一组标志的视图,并使用SQL或PL-SQL实时的基础数据计算的标志值(这是一个Oracle数据库)。这样的价值总是准确的,但性能可能会受到影响,规则必须由开发人员维护。
使该组标志包括静态数据,并使用某种类型的规则引擎来保持这些标志上最新的数据的变化。这样可以更容易地维护规则,但是在给定的时间点,标志可能不准确。 (如果我们用这种方法去,有一个规则引擎,可以轻松地以这种方式操纵数据库中的数据?)
您的数据多久更新一次?我们在说这些状态可能会改变每分钟,每小时,每天,每周吗? – JNK 2010-10-06 17:56:16
你的例子读起来像Prolog。 – Dave 2010-10-06 17:57:23
属性可能每天都在变化;团体可能每月。理想情况下,属性更改应在一分钟左右内完成。规则本身应该更少地改变;也许每隔几个月。 – 2010-10-06 18:27:05