2009-05-28 8 views
2

Je travaille sur quelque chose d'une application de type assistant pour permettre aux utilisateurs de créer des «scripts» simples qui effectuent essentiellement des actions basées sur certaines conditions. Les scripts qu'ils construisent seront stockés dans une base de données, et les modifications seront fréquentes, donc une sorte de génération de texte uniquement en avant n'est pas une option. Mon programme convertit cette structure de base de données interne à la sortie de script dont j'ai besoin, donc je vais juste re-générer la sortie à chaque fois qu'ils modifient leur script. Je cherche un conseil sur une bonne structure de base de données pour pouvoir stocker cette information. J'en ai un qui travaille en ce moment, mais je suis simplement curieux si j'ai manqué quelque chose d'évident qui le rendrait un peu nettoyeur. Toutes les suggestions sont appréciées.Conception de base de données pour les actions conditionnelles

Pour donner plus de détails, voici un exemple genericized du type de « script » un utilisateur peut créer par la cueillette des conditions et des actions dans l'interface graphique:

if ($variableA == 100 && $variableB > 25 && $variableC < 10) 
{ 
    performAction(); 
    performAnotherAction(); 
    if ($variableC == 0) 
    { 
     performYetAnotherAction(); 
    } 
    else if ($variableC == 1 || $variableC == 2) 
    { 
     performEvenMoreActions(); 
    } 
} 
else 
{ 
    performDefaultAction(); 
} 

Quelques notes sur ce qui est et ne possible, juste pour que ce soit clair:

  • "si" les conditionnels peuvent avoir un certain nombre de conditions "else if", ainsi qu'un "else" facultatif. Chaque condition peut avoir n'importe quel nombre de "tests" ($variableA == 100, etc), cependant chaque test peut être considéré comme étant (<variable>,<operator>,<test value>), il n'y a pas besoin de s'inquiéter des conditions plus complexes.
  • Même si chaque condition peut avoir un nombre quelconque de tests, ils seront toujours joints par le même opérateur booléen. Autrement dit, s'il y a plusieurs tests dans un conditionnel, ils sont toujours soit joints par &&, soit toujours joints par ||, il n'y a pas de mixage.
  • Les conditions peuvent être imbriquées à l'infini, donc une sorte de structure hiérarchique est nécessaire.
  • À l'intérieur des conditionnelles, il peut y avoir un nombre quelconque d'actions qui doivent être exécutées dans la même séquence que celle définie. Les actions peuvent simplement être représentées comme un nom de fonction, il n'y a pas d'autres types d'actions.

Répondre

1

Vous n'avez décrit aucune exigence pour l'extraction ou la recherche de fragments de scripts à l'aide de SQL, il n'est donc pas nécessaire de décomposer le script.

Donc je ne voudrais pas essayer de stocker le script intelligemment dans une base de données.Au lieu de cela, il suffit de stocker le script entier dans un BLOB de texte et de traiter un script comme une valeur atomique unique par rapport à son stockage.

Toute manipulation que vous faites au script se fera dans votre application, vous avez donc besoin d'un analyseur. Choisissez donc une syntaxe simple facile à analyser. Je suggère soit Python, XML ou votre propre langage spécifique au domaine. FWIW, j'ai beaucoup d'expérience à la fois avec les bases de données et avec les analyseurs syntaxiques. Ce n'est pas une tâche très difficile, c'est complètement inutile, dans la mesure où vous avez décrit votre projet.

Ligne inférieure: le code est un code, et les données sont des données.

+0

Oui, c'est vrai. Je suppose que j'essayais juste de garder mes options ouvertes pour l'avenir, mais peut-être que je suis en train de concevoir. –

+0

C'est très bien si vous avez besoin de pouvoir modifier les scripts. Mais un SGBDR n'est pas le meilleur outil pour ce travail. Essayer de décomposer un script en éléments syntaxiques et de les stocker dans la base de données entravera, plutôt que d'aider, la flexibilité future. –

2

Chaque fois que je devais stocker/manipuler quelque chose de «type code», j'ai toujours fini par suivre la route XML. La raison principale étant qu'exprimer puis calculer quelque chose comme (a et b et (c ou (d et e))) est beaucoup plus facile dans une structure hiérarchique.

Dans votre exemple, l'imbrication est la condition de sorte que quelque chose comme. (Très rugueux, juste pour donner une idée)

<if> 
    <expression /> 
    <true> 
     <action /> 
    </true> 
    <false> 
     <if> 
      <expression /> 
      <true> 
       <action /> 
      </true> 
     </if> 
    </false> 
</if> 

Si vous utilisez SQL2005 + il a son type de données HierarchyId, vous pouvez l'utiliser au lieu d'un format XML pour maintenir la hiérarchie, son beaucoup plus utile pour obtenir toutes les données relatives à un nœud, etc.

Note: Ceci n'est en aucun cas destiné à être une réponse complète ou même une réponse partielle, en jetant juste quelques expériences là-bas.

+0

Chaque fois que j'ai essayé de transformer XML en langage de programmation (et je l'ai fait plusieurs fois), j'ai fini par produire du goo illisible. Si vous voulez un langage de programmation, utilisez un langage de programmation - la facilité d'analyse de XML ne devrait pas vous influencer ici. –

1

Vous pouvez représenter chaque noeud avec une référence à son parent, puis vous joindre aux parents pour les renvoyer. C'est une méthode standard de représentation de structures hiérarchiques dans une base de données relationnelle. Alternativement, si chacune des règles est discrète, vous pouvez la représenter dans un format textuel ou XML et simplement stocker la règle dans un blob. Si vous traitez un grand nombre de ces règles, vous pouvez envisager d'utiliser un moteur de règles dérivé de Rete, tel que Ilog.

Questions connexes