【发布时间】:2011-04-21 23:40:28
【问题描述】:
我正在开展一个项目,在该项目中,我们需要确定大量人员的某些类型的状态,并存储在数据库中。确定这些状态的业务规则相当复杂,并且可能会发生变化。
例如,
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)从基础数据中实时计算标志值。这样,值总是准确的,但性能可能会受到影响,并且规则必须由开发人员维护。
使标志集由静态数据组成,并使用某种类型的规则引擎使这些标志在基础数据更改时保持最新。这样可以更轻松地维护规则,但标志可能在给定时间点不准确。 (如果我们采用这种方法,是否有一个规则引擎可以轻松地以这种方式操作数据库中的数据?)
【问题讨论】:
-
您的数据多久更新一次?我们是在说这些状态可能每分钟、每小时、每天、每周都会改变吗?
-
你的例子读起来像 Prolog。
-
属性可以每天更改;团体可能每月一次。理想情况下,状态应该在属性更改后的一分钟左右内准确无误。规则本身应该不那么频繁地改变;可能每隔几个月。
-
re prolog:确实如此,尽管我的示例更多地是为了说明规则将如何嵌套 if/then 逻辑等。我确实阅读了一些关于“演绎数据库”的概念,其中使用规则,通常在序言中,根据数据推断一组事实。这很完美,但我不认为有任何这样的现实世界就绪系统,而且我怀疑我的同事会想要学习 prolog(而且我自己已经 20 年没有使用过 prolog)。
标签: sql database oracle rule-engine business-rules