Best Practices: Speichern einer workflow-Zustand eines Elements in einer Datenbank?
Ich habe eine Frage zu best practices in Bezug auf, wie sollte man Vorgehen speichern von komplexen workflow-Staaten für die Bearbeitung der Aufgaben in einer Datenbank. Ich habe online-Suche keinen Erfolg, so dass ich dachte, ich würde bitten die community, was Sie dachte, war am besten.
Diese Frage kommt aus der gleichen "BoxItem" ein Beispiel gab ich in einer vorherigen Frage. Diese "BoxItem" verfolgt wird in meinem system als verschiedene Aufgaben werden auf Sie. Die Aufgabe kann über mehrere Tage und mit der menschlichen Interaktion, also dem Stand der BoxItem muss beibehalten werden. Wer hat die Aufgabe (falls zutreffend), und wenn die Aufgabe erledigt wurde, muss auch verfolgt werden.
Zuerst, ich näherte mich dies, indem Sie drei Felder der "BoxItems" Tabelle für jedes Mensch-interaktive Aufgabe, die getan werden musste:
IstTaskNameKomplette
DatumTaskNameKomplette
BenutzerTaskNameKomplette
Diese funktionierte, wenn der workflow war einfach... aber jetzt, dass es hat sich zu einem komplexen Prozess (> 10 möglichen menschlichen Interaktionen, die in der Strömung... über die Hälfte davon sind optional, und kann oder kann nicht getan werden für die BoxItem, die führten mich Anfang hinzufügen "TunTaskName" Felder als auch für diejenigen, die optionalen Aufgaben), habe ich gefunden, dass das, was haben sollte gewesen, eine einfache Tabelle hat nun 40 oder so in den Bereich widmet sich ganz der Beibehaltung dieses Status-Informationen.
Frage ich mich, ob es nicht einen besseren Weg, es zu tun... aber ich bin ratlos.
Mein Erster Gedanke war es, einen generischen "BoxItemTasks" - Tabelle, die definiert die Aufgaben, die getan werden kann auf einem bestimmten Feld, aber ich würde noch brauchen, speichern Sie die Datums-und Benutzer-Informationen individuell, so dass es nicht wirklich helfen.
Mein zweiter Gedanke war, dass es vielleicht nicht egal, und ich sollte nicht sorgen, wenn diese Tabelle hat 40 oder mehr Felder gewidmet Zustand behalten... und vielleicht bin ich auch nur paranoid. Aber es fühlt sich wie eine Menge von Informationen zu behalten.
Na ja, ich bin an einem Verlust so weit wie das, was eine Dritte option sein könnte, oder wenn eine der beiden oben genannten Optionen ist eigentlich vernünftig. Ich kann sehen, dass dieser workflow möglicherweise noch komplexer, in die Zukunft, und für jede neue Aufgabe, die ich werde brauchen, um hinzuzufügen, 3-4 Felder nur zur Unterstützung der Verfolgung von es... es fühlt sich an wie es ist außer Kontrolle geraten.
Was würden Sie in dieser situation tun?
Sollte ich beachten Sie, dass dies die Wartung eines bestehenden Systems, eine, die gebaut wurde, ohne ein ORM, also ich kann nicht einfach lassen Sie es bis zu den ORM zu kümmern.
EDIT:
Kev, sprechen Sie über etwas wie das zu tun:
BoxItems
(PK) BoxItemID
(Andere irrelevante Sachen)
BoxItemActions
(PK) BoxItemID
(PK) BoxItemTaskID
IsCompleted
DateCompleted
UserCompleted
BoxItemTasks
(PK) TaskType
Beschreibung (wenn auch notwendig)
Hmm..., das würde funktionieren... es würde darstellen eine Notwendigkeit, Sie zu ändern, wie ich derzeit-Ansatz tut SQL-Abfragen, um zu sehen, welche Elemente in welchem Staat, aber auf lange Sicht so etwas wie dieses sieht wie es besser funktionieren würde (ohne dass eine grundlegende design-änderung, wie die Serialisierung Idee darstellt... obwohl, wenn ich die Zeit hätte, ich würde es gerne spielen, wie ich denke.).
So ist es das, was Sie waren, zu erwähnen, Kin, oder bin ich aus?
EDIT: Ah, ich sehe deine Idee mit der "Letzten Aktion" ermitteln Sie den aktuellen Status... ich mag es! Ich denke, dass könnte für mich arbeiten... ich habe vielleicht ändern Sie es ein wenig (weil irgendwann Aufgaben gleichzeitig passieren), aber die Idee scheint eine gute zu sein!
EDIT FINAL: Also in Summe, wenn sich jemand anderes suchen, dieses in der Zukunft mit der gleichen Frage... es klingt wie die Serialisierungs-Ansatz wäre nützlich, wenn Ihr system die information pre-loaded in einer Schnittstelle, wo es queryable (also nicht direkt dem Aufruf der Datenbank selbst, als ad-hoc-system an dem ich arbeite), aber wenn Sie das nicht haben, die zusätzlichen Tabellen, die Idee scheint, wie es gut funktionieren sollte! Danke Euch allen für Eure Antworten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehen richtig, ich möchte hinzufügen, die BoxItemTasks Tabelle (nur eine Aufzählung Tabelle, richtig?), dann ein BoxItemActions Tabelle mit Fremdschlüssel zu BoxItems und BoxItemTasks für welche Art von Aufgabe es ist. Wenn Sie möchten, machen Sie es so, dass eine bestimmte Aufgabe kann nur ausgeführt werden, sobald auf einem bestimmten Feld Element, stellen Sie einfach die (Artikel + Aufgaben) - paar Spalten werden die Primärschlüssel der BoxItemActions.
(Sie legte es viel besser, als ich es Tat, und ein dickes Lob für die richtig interpretieren, was ich sagen wollte. Was du geschrieben hast ist genau das, was ich Malte.)
Als für die Ermittlung des aktuellen Zustands, könnten Sie schreiben Sie einen trigger auf BoxItemActions, dass updates einer einzelnen Spalte BoxItems.LastAction. Für gleichzeitige Aktionen, Ihre Auslöser konnte nur besonderen Fällen zu entscheiden, welche Aktion dauert Aktualität.
Als der vorherigen Antwort vorgeschlagen, ich würde brechen Ihre Tabelle in mehrere.
BoxItemActions, enthält eine Liste der Aktionen, die der Workflow benötigt, um durch zu gehen, jedes mal erstellt, wenn ein BoxItem erstellt. In dieser Tabelle können Sie verfolgen, die detaillierte Daten \ times \ Benutzer bei jeder Aufgabe abgeschlossen wurde.
Mit dieser Art von Anwendung, zu wissen, wo sich das Feld zum nächsten gehen zu bekommen kann ganz schön schwierig, so eine "Karte" die weiteren Schritte für die Box wird sehr hilfreich sein. Wie gut kann diese Tabelle Gruppe wie verrückt, Hunderte von Zeilen pro Feld, und es wird noch sehr einfach Abfragen.
Es macht es auch möglich, eine 'andere Wege', die einfach geändert werden kann. Eine Stammdaten-Tabelle der 'Pfade' durch den work-flow ist eine Lösung, wo, wie jede box wird erstellt, hat der Benutzer auswählen, welchen " Weg " die box wird Folgen. Oder Sie könnte so eingerichtet, dass, wenn der Benutzer erstellt die box, die Sie wählen Aufgaben, die erforderlich sind für diese Besondere box. Hängt davon ab, unsere business-problem.
Wie etwa eine hybride der Serialisierung und der Datenbank-Modelle. Ein XML-Dokument dient als master-workflow-Dokument, mit einem Knoten für jeden Schritt mit Attributen und Elementen, die detail-es ist der name, um in den Prozess, die Bedingungen für die Frage, ob es optional ist oder nicht, etc. Am wichtigsten ist jeder Schritt Knoten kann ein eindeutiger Schritt-id.
Dann in Ihrer Datenbank haben Sie einen einfachen zwei-Tabelle Struktur. Die BoxItems Tabelle speichert Ihre grundlegenden BoxItem Daten. Dann ein BoxItemActions Tabelle wie in der Lösung, die Sie als "Antwort" gekennzeichnet.
Es ist im wesentlichen ähnlich wie die Lösung akzeptiert die Antwort, aber anstelle von einem BoxItemTasks Tabelle zum speichern der master-Liste von Aufgaben, die Sie in einem XML-Dokument, das erlaubt etwas mehr Flexibilität für die eigentliche workflow-definition.
Für was es Wert ist, in der BizTalk-Sie "Austrocknen" lange-laufen-Nachricht Muster (workflows und dergleichen) durch die binäre Serialisierung auf die Datenbank.
Ich glaube, ich würde serialisieren des Workflow-Objekts in XML und speichern Sie in der Datenbank mit einer ID-Spalte. Es kann schwieriger sein, zu berichten, aber es klingt wie es kann Arbeit in Ihrem Fall.
Für diese Art von problem, betrachten Sie das Datenbank-schema dargestellt, in http://www.databaseanswers.org/data_models/workflow/index.htm die Modelle eine Reihe von Ereignissen in einem busniess-Prozess.