Ich arbeite an der Erstellung eines Datenmodells zum Speichern von Daten im Zusammenhang mit der Produktionsverfolgung. Ich arbeite für ein Ingenieurbüro, das Daten für unsere Kunden modelliert und analysiert. Der Prozess besteht aus mehreren Schritten und wird ständig aktualisiert.
Ich versuche, die Prozesse zu modellieren und übergeordnete Prozesse und die sequentielle Reihenfolge der Prozesse einzubeziehen.
Zum Beispiel:
Process Table
---------------------
ProcessID - uniqueidentifier
ProcessName - varchar
ProcessDescription - varchar
...
ProcessOrder Table
---------------------
ProcessID - uniqueidentifier FK - Process
ParentProcessID - uniqueidentifier FK - Process
ProcessOrder - int
...
In der ProcessOrder
Spalte in der ProcessOrder
Tabelle wird einfach eine Zahl gespeichert, die angibt, welchen sequentiellen Schritt im übergeordneten Prozess sie darstellt.
Ein Modellierungsverfahren umfasst beispielsweise die folgenden Schritte: Neues leeres Modell erstellen, Modell benennen, Modellparameter eingeben. Die Process
Tabelle würde aussehen wie:
ProcessID | ProcessName | ProcessDescription
-------------------------------------------------
UUID1 | Modeling | Create Model of Data
UUID2 | New Model | create new empty model
UUID3 | Name Model | name model
UUID4 | Parameters | enter model parameters
Die ProcessOrder
Tabelle würde aussehen wie:
ProcessID | ParentProcessID | ProcessOrder
--------------------------------------------------
UUID2 | UUID1 | 1
UUID3 | UUID1 | 2
UUID4 | UUID1 | 3
Das Problem bei diesem Entwurf ist, dass sich bei der Aktualisierung des Workflows die Prozessreihenfolge ändert und ich den ProcessOrder
Datensatz für den geänderten Prozess und für alle nachfolgenden Datensätze mit demselben aktualisieren muss ParentProcessID
.
Gibt es eine bessere Möglichkeit, diese Art von Daten zu speichern und die Normalisierung aufrechtzuerhalten?
Antworten:
Ihr Design erscheint mir vernünftig. Während Sie alle nachfolgenden Datensätze aktualisieren müssen, wenn neue Prozesse hinzugefügt oder gelöscht werden, ist dies einfach durchzuführen. Sie geben nur ein Update heraus wie:
und dann einfügen oder löschen.
Die einzige andere Möglichkeit, die ich mir vorstellen kann, besteht darin, das Schema so zu entwerfen, dass die nächste Prozess-ID in der Zeile gespeichert wird. Etwas wie:
Wenn Sie dann einen neuen Schritt einfügen - beispielsweise zwischen UUID3 und UUID4 -, führen Sie eher eine verknüpfte Listenoperation aus, bei der die NextId von UUID3 | UUID1 auf UUID5 aktualisiert wird, und fügen Sie dann einfach die neue UUID5 mit einer NextId von UUID4 ein.
Dies reduziert die UPDATEs in den meisten Fällen auf 1, erschwert jedoch das Abfragen des Prozesses, da Sie jetzt die Liste von oben nach unten durchlaufen müssen, um sie Schritt für Schritt aufzulisten.
Sie müssen entscheiden, welchen Prozess Sie bevorzugen möchten - Einfügen und Aktualisieren oder Abrufen. Wenn Sie das Abrufen bevorzugen (was möglicherweise der Fall ist, wenn Änderungen selten sind und häufig Berichte erstellt werden und die Listen kurz sind), wählen Sie Ihr ursprüngliches Design. Wenn Sie das Einfügen und Aktualisieren bevorzugen (was möglicherweise der Fall ist, wenn ständig Änderungen vorgenommen werden und die Berichterstellung selten ist oder die Listen wirklich sehr lang sind), wählen Sie den Ansatz für verknüpfte Listen.
Ich hoffe das hilft. Interessiert daran, welche anderen Lösungen die Community finden könnte, da ich gerne mein Wissen darüber erweitern würde!
quelle
Wenn Sie nur speichern müssen, welcher Schritt Ihres Prozesses nach welchem vorherigen Schritt erfolgt, benötigen Sie lediglich Folgendes:
ProcessID | ParentProcessID | PreviousProcessID
Natürlich benötigen Sie eine FK-Einschränkung, um sicherzustellen, dass (ParentProcessID | PreviousProcessID) auf eine gültige (ParentProcessID | ProcessID) verweist.
Wenn ich Ihre Anforderungen verstanden habe und dieses Design gültig ist, ist es einfach, Schritte in Ihrem Prozess einzufügen, zu entfernen oder zu verschieben. Sie müssen keine Änderungen an Ihren untergeordneten Tabellen weitergeben, da diese auf Ihren Primärschlüssel in (ParentProcessID) verweisen | ProcessID).
HIH
quelle
Ein paar Fragen zuerst ...
Drei und vier oben können gelöst werden, indem Datensätze für jede einzelne Änderung eingefügt werden, anstatt Datensätze zu aktualisieren. Dies wird natürlich eine Menge zusätzlicher Daten erzeugen, aber es wird Ihnen auch eine Menge zusätzlicher Einblicke in den Workflow selbst geben und schließlich Informationen bereitstellen, die für Trends, PKIs und andere Business Intelligence verwendet werden können, was uns zum Data Warehousing bringt. Aber das ist ein anderer Beitrag.
quelle
Der Prozessschritt ist in Ihrem Fall nur dann sinnvoll, wenn eine Prozessversion definiert ist. Man könnte also sagen, dass die Schritte von Prozess 1 in dieser Reihenfolge (a, b, d, c) ausgeführt wurden, als der Prozess in Version 1 war, aber in Version 2 wurde die Schrittausführungsreihenfolge in (a, b, c) geändert. Daher denke ich, dass eine Prozessversion wichtig ist.
Das folgende Diagramm zeigt meinen Vorschlag.
Das Dumme daran ist, dass Sie, wenn Sie die Reihenfolge eines Schritts ändern, alle Schritte erneut in die neue Reihenfolge einfügen müssen, aber in diesem Fall spielt es weder räumlich noch zeitlich eine Rolle.
quelle