Souvent, vous pouvez simplifier ce genre de choses en utilisant les éléments suivants Forme normale disjonctive .
Vous normalisez votre logique en une série de disjonctions -- "clauses or". Chaque disjonction est un ensemble de "clauses et".
Vos règles deviennent donc la disjonction longue suivante.
OU
(Vous pouvez toujours faire cela, BTW, avec n'importe quelle logique. Le problème est que certaines choses peuvent être vraiment compliquées. La bonne nouvelle, c'est qu'aucun responsable du marketing n'essaiera de vous imposer une logique difficile et déconcertante. De plus, la réécriture de la forme n'importe quel-ancien à la forme normale disjonctive est un morceau d'algèbre facile).
Vous remarquerez qu'il y a toujours deux niveaux de profondeur : toujours une liste de niveau supérieur de disjonctions (dont chacune peut être vraie) et une liste de niveau inférieur de conjonctions (qui doivent toutes être vraies).
Ainsi, vous avez une table "Conditions" avec des colonnes comme l'id et le nom du produit. Cela définit une comparaison simple entre le poste et le produit.
Vous disposez d'une table Conjonctions ("mid-level and clause") avec des colonnes telles que l'ID de la conjonction et l'ID de la condition. Une jointure entre conjonct et condition produira toutes les conditions pour la conjonct. Si toutes ces conditions sont vraies, la conjonction est vraie.
La table Disjuncts ("top-level or clause") contient des colonnes telles que disjunct Id et conjunct ID. Si l'une de ces disjonctions est vraie, la disjonction est vraie.
Une jointure entre les disjoncteurs, les conjoncteurs et les conditions produit l'ensemble complet des conditions que vous devez tester.