2009-05-28 13 views
2

Ich arbeite an etwas wie eine Wizard-Anwendung, um Benutzern zu ermöglichen, einfache "Skripte" zu erstellen, die basierend auf bestimmten Bedingungen grundsätzlich Aktionen ausführen. Skripte, die sie erstellen, werden in einer Datenbank gespeichert, und Modifikationen werden üblich sein, so dass eine Art von Vorwärts-Nur-Text-Generierung keine Option ist. Mein Programm konvertiert diese interne Datenbankstruktur in die eigentliche Skriptausgabe, die ich benötige. Daher werde ich die Ausgabe nur neu generieren, wenn sie ihr Skript ändern.Datenbankentwurf für bedingte Aktionen

Ich suche einen Ratschlag über eine gute Datenbankstruktur, um diese Informationen speichern zu können. Ich habe im Moment eine Arbeit, aber ich bin nur neugierig, wenn ich etwas Offensichtliches vermisse, das es ein wenig machen würde Reiniger. Irgendwelche Vorschläge werden geschätzt.

etwas ausführlicher zu geben, ist hier ein genericized Beispiel für die Art von „Skript“ ein Benutzer durch Kommissionierung Bedingungen und Aktionen in der GUI erstellen:

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

Einige Hinweise über das, was ist und was nicht möglich, nur so, dass es klar:

  • „if“ conditionals eine beliebige Anzahl von haben kann „else if“ conditionals angebracht ist, sowie ein optionales „else“.
  • jede bedingte kann eine beliebige Anzahl von "Tests" ($variableA == 100, etc.), aber jeder Test kann als dargestellt werden, gibt es keine Notwendigkeit, sich über komplexere Bedingungen sorgen.
  • obwohl jede Bedingung eine beliebige Anzahl von Tests haben kann, wird ihnen immer derselbe boolesche Operator beigefügt. Das heißt, wenn mehrere Tests in einer Bedingung vorhanden sind, werden sie entweder immer durch && verbunden oder immer durch || verbunden, es gibt keine Mischung.
  • Bedingungen können unendlich verschachtelt werden, daher ist eine Art von hierarchischer Struktur notwendig.
  • Innerhalb von Bedingungen kann es eine beliebige Anzahl von Aktionen geben, die in der gleichen Reihenfolge ausgeführt werden müssen, in der sie definiert sind. Aktionen können einfach als Funktionsname dargestellt werden, Sie müssen sich keine anderen "Aktionstypen" vornehmen.

Antwort

1

Sie haben keine Anforderung zum Abrufen oder Durchsuchen von Fragmenten von Skripten mit SQL beschrieben, sodass das Skript nicht zerlegt werden muss.

Also würde ich nicht versuchen, das Skript geschickt in einer Datenbank zu speichern.Speichern Sie stattdessen das gesamte Skript in einem Text-BLOB und behandeln Sie ein Skript als einen einzelnen atomaren Wert in Bezug auf dessen Speicherung.

Jede Manipulation, die Sie an dem Skript vornehmen, wird in Ihrer Anwendung durchgeführt, also benötigen Sie einen Parser. Wählen Sie also eine einfache Syntax, die leicht zu analysieren ist. Ich empfehle entweder Python, XML oder Ihre eigene domänenspezifische Sprache.

FWIW, ich habe viel Erfahrung sowohl mit Datenbanken als auch mit Parsern. Das ist keine sehr schwere Aufgabe, es ist einfach völlig unnötig, soweit Sie Ihr Projekt beschrieben haben.

Fazit: Code ist Code, und Daten sind Daten.

+0

Ja, das ist wahr genug. Ich glaube, ich habe nur versucht, meine Optionen für die Zukunft offen zu halten, aber vielleicht übertreibe ich. –

+0

Es ist in Ordnung, wenn Sie die Skripte ändern müssen. Aber ein RDBMS ist nicht das beste Werkzeug für diesen Job. Der Versuch, ein Skript in syntaktische Elemente zu zerlegen und sie in der Datenbank zu speichern, wird zukünftige Flexibilität eher behindern als helfen. –

2

Immer wenn ich etwas "Code-like" speichern/manipulieren musste, ging ich immer den XML-Weg hinunter.

Der Hauptgrund dafür ist, dass das Ausdrücken und dann Berechnen von etwas wie (a und b und (c oder (d und e))) viel einfacher in einer hierarchischen Struktur ist.

In Ihrem Beispiel ist die Verschachtelung der Bedingungen so etwas wie. (Sehr rau, nur eine Idee)

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

Wenn Sie SQL2005 verwenden + hat es hierarchyid Datentyp Sie diese anstelle eines XML-Format verwenden können, um die Hierarchie zu pflegen, seine viel nützlicher für Alle Daten beziehen sich auf einen Knoten, usw.

Hinweis: Dies ist keineswegs eine vollständige Antwort oder auch nur eine Teilantwort, nur ein paar Erfahrungen da draußen werfen.

+0

Immer wenn ich versucht habe, XML in eine Programmiersprache zu verwandeln (und das habe ich schon oft gemacht), habe ich schließlich unlesbares Schmiere produziert. Wenn Sie eine Programmiersprache wollen, verwenden Sie eine Programmiersprache - das einfache Parsen von XML sollte Sie hier nicht beeinflussen. –

1

Sie können jeden Knoten mit einem Verweis auf seine Eltern darstellen und dann mit den Eltern verbinden, um die Kinder wieder herauszuholen. Dies ist eine Standardmethode zum Darstellen von hierarchischen Strukturen in einer relationalen Datenbank.

Alternativ, wenn jede der Regeln diskret ist, können Sie sie in einem Text- oder XML-Format darstellen und die Regel einfach in einem Blob speichern. Wenn Sie eine große Anzahl dieser Regeln verarbeiten, sollten Sie in Betracht ziehen, eine von Rete abgeleitete Regel-Engine wie Ilog zu verwenden.

Verwandte Themen