Vorwort: Ich habe keine Erfahrung mit Regel-Engines, Bauregeln, Modellierungsregeln, Implementieren von Datenstrukturen für Regeln oder was auch immer. Daher weiß ich nicht, was ich mache oder ob das, was ich versucht habe, weit von der Basis entfernt ist.Was ist eine geeignete Datenstruktur und ein Datenbankschema zum Speichern von Logikregeln?
Ich versuche herauszufinden, wie das folgende hypothetische Szenario zu speichern und zu verarbeiten. Um mein Problem zu vereinfachen, sage ich, dass ich einen Spieltyp habe, bei dem ein Benutzer ein Objekt kauft, wo es 1000 mögliche Objekte geben kann und die Objekte in einer bestimmten Reihenfolge und nur in bestimmten Gruppen gekauft werden müssen. Angenommen, ich bin der Benutzer und möchte Objekt F erwerben. Bevor ich Objekt F kaufen kann, muss ich zuvor Objekt A ODER (B und C) gekauft haben. Ich kann weder F und A noch F und B, C kaufen. Sie müssen in der Reihenfolge sein, die die Regel angibt. Eine erste, dann F später. Oder, B, C zuerst, dann F später. Ich bin jetzt nicht besorgt über die Zeitspanne zwischen Käufen oder andere Eigenschaften des Benutzers, nur dass sie die richtige Reihenfolge für jetzt sind.
Was ist der beste Weg, um diese Informationen für potenziell Tausende von Objekten zu speichern, die es mir erlaubt, die Regeln für das gekaufte Objekt einzulesen, und dann gegen den vorherigen Kaufverlauf des Benutzers zu überprüfen?
Ich habe das versucht, aber ich bin stecken bei dem Versuch, die Gruppierungen wie A OR (B und C) zu implementieren. Ich möchte die Regeln in einer Datenbank speichern, wo ich diese Tabellen haben:
Objects
(ID(int),Description(char))
ObjectPurchRules
(ObjectID(int),ReqirementObjectID(int),OperatorRule(char),Sequence(int))
Aber natürlich, wie Sie durch die Ergebnisse verarbeiten, ohne die Gruppierung, erhalten Sie die falsche Antwort. Ich möchte, wenn möglich, übermäßiges String-Parsing vermeiden :). Ein Objekt könnte eine unbekannte Anzahl vorher erforderlicher Käufe haben. SQL- oder psuedocode-Snippets zur Verarbeitung der Regeln wären willkommen. :)