Ich möchte eine Assembly-Linie in SQL Server modellieren. Dieses Objekt würde durch eine lineare Reihe von Schritten fortschreiten. Jeder Schritt würde einen linearen Satz von Status haben: Warten, In Bearbeitung und Abgeschlossen. Welcher Ansatz eignet sich am besten, um Daten über eine Änderung in Schritt und/oder Zustand zu erfassen? Fügen Sie einen Datensatz für das Objekt ein und aktualisieren Sie ein Schrittfeld und ein Statusfeld, wenn sich diese Eigenschaften ändern? Oder sollte ich jedes Mal, wenn das Objekt zu einem neuen Schritt fortschreitet oder einen Status in diesem Schritt ändert, einen neuen Datensatz einfügen? Ich habe letzteres versucht, und ich fand die SQL-Abfragen erforderlich, um kompliziert zu sein.Modellieren einer Fertigungslinie in SQL Server
Antwort
Wenn ein Objekt nur einen Status hat, empfehle ich den Status Feldansatz: einfacher zu verwalten, schneller abzufragen. Ich habe diese Lösung in einigen Anwendungen verwendet und ich habe keine Probleme gesehen.
Sie verlieren fast alle Ihre Verlaufsinformationen, die normalerweise in Anwendungen vom Typ "Fließband" gemeldet werden sollen. –
Dies gehört zu Stackoverflow und ich habe beschlossen, es als solches zu schließen. Nachdem ich das gesagt habe, werde ich sagen, dass ich Systeme wie dieses entwickelt und implementiert habe (ein Inventarsystem für einen Hersteller von Motorradteilen ist das Neueste) und die Flexibilität, die ein "transaktives" Modell hat (dh die Option "neuen Datensatz einfügen")) ist wunderbar und seine Nützlichkeit überwiegt die "Komplexität" in den Abfragen bei weitem. Die Verwendung der "MAX" - und "MIN" -Aggregatfunktionen gegen die Datetime-Felder, die die Zeit identifizieren, in der eine Operation zusammen mit den "TOP ..." - Qualifizierern für SELECT-Anweisungen aufgetreten ist, kann die komplizierten Abfragen wesentlich vereinfachen.
Workflows im Allgemeinen werden am besten mit Warteschlangen modelliert. Siehe Building the MSDN Aggregation System, und ich kenne einige echte Fabrikmontagelinien, die auch Warteschlangen verwenden.
Sie können beides: Sie können einen "aktuellen" Status für jedes Objekt und eine Verlaufsgeschichte für den Fall beibehalten, dass Sie sehen müssen, welchen Weg das Objekt durch die Warteschlange genommen hat und wie lange es dauerte. Wenn jeder Status mehr Statusinformationen benötigt (die für jeden Status unterschiedlich sind), müssen Sie separate Tabellen für jede Gruppierung von Statusinformationen erstellen oder, wenn Sie sie als eine Gruppe von Schlüssel/Wert-Paaren darstellen können, eine einfache Eigenschaftentabelle erstellen .
Hier ist ein einfaches Beispiel eines Tabellenlayout:
Object Table:
Id, Name, Description, State
ObjectHistory Table:
Id, ObjectId, Timestamp, State
Properties Table:
Id, ObjectId, Name, Value
--or--
State1Info Table
Id, ObjectId, ...
State2Info Table
Id, ObjectId, ...
Jedes Mal, wenn Sie "Summen" verwalten (durch Duplizieren von Daten, was im Wesentlichen das ist, worüber Sie sprechen), laufen Sie Gefahr, dass die "Gesamtsumme" nicht mit der Realität übereinstimmt. Sie sollten zuerst normalisieren und dann die Normalisierungsregeln verletzen, wenn Sie wirklich, wirklich gute Gründe dafür haben. Wenn Sie den "aktuellen" Zustand von Objekt 1 in Ihrem obigen hypothetischen Schema wünschen, müsste man nur "SELECT TOP 1 State FROM ObjectHistory WHERE ObjectId = 1 ORDER BY Timestamp DESC" wählen. Es gibt keinen Grund, anderswo ein Duplikat des Staates aufrechtzuerhalten. –
Das ist definitiv eine bessere Lösung, danke! –
Dieses besser gefragt würde auf stackoverflow.com denke ich. – JamesHannah