Logique booleanne persistante

C'est une sorte de question liée au design plutôt qu'une question technique. Titre mai ne pas être parfait, n'hésitez pas à modifier.

J'ai une exigence comme ci-dessous: Je veux save les qualifications pour un jobEntity particulier (à ne pas confondre avec le travail SQL Server) dans SQL Server 2012 à partir de Table. Dans le même but, j'ai une autre table dite qualifications, qui sauve les qualifications ci-dessus par rapport à un travail qui a une intégrité référentielle avec une table de travail. La procédure stockée pour ce faire a le paramètre JobID et le type de table défini par l'user du schéma:

CREATE TYPE [dbo].[TableTypeQualificationJob] AS TABLE( [QualificationID] [int] NULL, [QualificationCriteria] [nvarchar](4000) NULL, [OptionTo] [bigint] NULL ) GO 

J'ai l'entité correspondante dans la couche de gestion. Ainsi, lorsque l'user crée plusieurs qualifications pour le travail, il passe List à la fonction, et les methods sous-jacentes convertissent la list en datatable et sont ajoutées dans les bases de données en utilisant la procédure stockée.

La prise est la qualification peut en OU ou ET. Par exemple, s'il y a 5 qualifications dites qualification1 qualification2 qualification3 qualification4 qualification5

et appliqué à l'emploi en tant que

qualification1 OU qualification2 OU qualification3 ET qualification4 ET qualification5

Donc, il fait trois groupes

(qualification1 OU qualification2 OU qualification3) ET (qualification4) ET (qualification5)

Alors, comment puis-je l'interpréter dans la class QualificationEntity et dans la database. J'appelle SP en utilisant ADO.NET en convertissant manuellement la list en DataTable pour le type de table défini par l'user, comment puis-je l'implémenter?

Je stocke les OrQualifications et les AndQualifications tant qu'entités distinctes et les conserve toutes les deux comme des references plusieurs-à-plusieurs avec l'entité Job , de cette façon vous pouvez différencier les qualifications.

Pour savoir si un candidat a les qualifications requirejses, vous vérifiez que TOUTES les qualifications de l'entité AndQualification sont satisfaites, ET que TOUTES les qualifications de l'entité OrQualifications sont remplies.


Modifier:

La réponse ci-dessus / initiale visait à satisfaire à l'exigence d'une list de qualifications requirejses et d'une autre où au less une était requirejse. Pour moi, cela semble assez bon, êtes-vous sûr que vous avez vraiment besoin de qualifications nestedes? Croyez-moi, rendre une application plus complexe qu'elle ne devrait l'être est une mauvaise idée.

Arbre d'expression
Les qualifications nestedes sont une autre bête et voici une solution suggérée: L'expression est stockée comme un tree binary complet (un tree binary où chaque nœud a exactement 0 ou 2 enfants). Tous les nœuds de cet tree sont constitués d'opérateurs AND et OR (& ou |) à l'exception des leafs qui seront les qualifications.

Exemple d'expression:
(A | B & C) | (D & E)

(La conversion d'une expression à un tree dépend entièrement de la façon dont vous saisissez datatables, alors que la plus simple serait simplement de créer l'tree manuellement!)

En tant qu'tree:

       |
    / \
   |  &
  / \ / \
 A & DE
    / \
   avant JC

Vous avez un certain nombre de choix différents sur la façon de conserver cet tree dans une database, par exemple:

  • Un model hiérarchique où le minimum absolu est deux colonnes, un Id et un ParentId. Pour récupérer l'tree, vous avez besoin d'une requête récursive. Cette option peut être assez exigeante pour une database relationnelle.
  • Sérialiser l'arborescence comme par exemple xml (XmlSerializer) ou json (json.NET) et l'save sous forme de text.

Personnellement, je choisirais l'option de serialization car vous aurez toujours besoin d'trees entiers et il est facile de désérialiser dans une infrastructure de données.

Voici un exemple de structure de données:

 public class Node { public Node LeftChild { get; set; } public Node RightChild { get; set; } } class OperatorNode : Node { public bool IsAnd { get; set; } } class QualificationNode : Node { public bool IsQualificationMet { get; set; } } 

Ensuite, vous avez besoin d'une fonction qui peut parsingr cette arborescence et afficher la valeur true ou false:

 public bool EvaluateNode( Node node ) { var qualificationNode = node as QualificationNode; if ( qualificationNode != null ) { return qualificationNode.IsQualificationMet; } var operatorNode = node as OperatorNode; if ( operatorNode.IsAnd ) { return EvaluateNode( node.LeftChild ) && EvaluateNode( node.RightChild ); } return EvaluateNode( node.LeftChild ) || EvaluateNode( node.RightChild ); } 

Disclaimer: Ceci est appelé code rapide et sale, s'il vous plaît faire quelque chose de mieux.

Autres options
Regardez dans System.Linq.Expressions.Expression. Il peut être utilisé pour build une logique par programme, alors c'est peut-être quelque chose que vous pouvez utiliser.