私は、データベースに保存されている大勢の人々の特定のタイプのステータスを判別する必要があるプロジェクトに取り組んでいます。これらのステータスを決定するためのビジネスルールはかなり複雑であり、変更される可能性があります。
例えば、
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)を使用して、基礎となるデータからリアルタイムでフラグ値を計算します。このように、値は常に正確ですが、パフォーマンスが低下する可能性があり、開発者がルールを維持する必要があります。
フラグのセットを静的データで構成し、ある種のルールエンジンを使用して、基になるデータが変更されたときにそれらのフラグを最新の状態に保ちます。このようにして、ルールをより簡単に維持できますが、特定の時点でフラグが不正確になる可能性があります。(このアプローチを採用する場合、この方法でデータベース内のデータを簡単に操作できるルールエンジンはありますか?)