Je travaille sur un projet dans lequel nous devrons déterminer certains types de statuts pour un grand nombre de personnes, stockés dans une base de données. Les règles métier pour déterminer ces statuts sont assez complexes et peuvent changer.application de règles métier au niveau de la base de données
Par exemple,
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.
Multiplier par plusieurs statuts douzaines, voire des centaines de groupes et d'attributs. Les personnes, les groupes et les attributs sont tous dans la base de données.
Bien que cela sera consommé par une application Java, nous voulons également pouvoir exécuter des rapports directement sur la base de données, il serait donc préférable que l'ensemble des états calculés soit disponible au niveau des données. Notre plan de conception actuel consiste donc à avoir une table ou une vue constituée d'un ensemble de drapeaux booléens (hasStatusA? HasStatusB? HasStatusC?) Pour chaque personne. De cette façon, si je veux interroger tout le monde qui a le statut C, je n'ai pas besoin de connaître toutes les règles pour le calcul du statut C; Je vérifie juste le drapeau.
(Notez que, dans la vraie vie, les drapeaux auront des noms plus significatifs: isEligibleForReview ?, isPastDueForReview ?, etc.).
Donc a) est-ce une approche raisonnable, et b) si oui, quelle est la meilleure façon de calculer ces drapeaux?
Certaines options que nous envisageons pour les drapeaux de calcul:
Faire l'ensemble des drapeaux vue, et calculer les valeurs de drapeau des données sous-jacentes en temps réel à l'aide de SQL ou PL-SQL (ce qui est une base de données Oracle). De cette façon, les valeurs sont toujours précises, mais les performances peuvent en souffrir, et les règles doivent être maintenues par un développeur.
Faites en sorte que l'ensemble d'indicateurs soit composé de données statiques et utilisez un moteur de règles pour maintenir ces indicateurs à jour lorsque les données sous-jacentes changent. De cette façon, les règles peuvent être maintenues plus facilement, mais les drapeaux pourraient être inexacts à un moment donné. (Si nous allons avec cette approche, est-il un moteur de règles qui peuvent facilement manipuler des données dans une base de données de cette façon?)
À quelle fréquence vos données seront-elles mises à jour? Parlons-nous de ce statut pourrait changer chaque minute, heure, jour, semaine? – JNK
Votre exemple se lit comme Prolog. – Dave
Les attributs peuvent changer quotidiennement; groupes peut-être mensuels. Statuts devraient idéalement être précis dans une minute ou deux d'un changement d'attribut. Les règles elles-mêmes devraient changer moins souvent; peut-être tous les quelques mois. –