タスクを処理するための複雑なワークフロー状態をデータベースに格納する方法に関するベスト プラクティスについて質問があります。私はオンラインで探しても無駄だったので、コミュニティに彼らが何が最善だと思うか尋ねてみようと思いました.
この質問は、前の質問で示したのと同じ「BoxItem」の例から出てきます。この「BoxItem」は、さまざまなタスクが実行されているため、システムで追跡されています。タスクは数日にわたって人的介入を伴う場合があるため、BoxItem の状態を永続化する必要があります。誰がタスクを実行したか (該当する場合)、いつタスクを実行したかも追跡する必要があります。
最初に、実行する必要がある人間と対話するタスクごとに「BoxItems」テーブルに 3 つのフィールドを追加することで、これに取り組みました。
TaskName は完了していますか
日付TaskName完了
ユーザーTaskName完了
これは、ワークフローが単純だったときに機能しました...しかし、現在では複雑なプロセスに成長しています (フロー内で可能な人間の相互作用は 10 を超えています...その約半分はオプションであり、BoxItem に対して実行される場合と実行されない場合があります。その結果、これらのオプションのタスクにも「Do TaskName」フィールドを追加し始めました)、単純なテーブルであるべきだったものが、この状態情報の保持に完全に専念する40ほどのフィールドになっていることがわかりました.
もっといい方法はないかと悩んでいますが…困っています。
最初に考えたのは、特定のボックスで実行できるタスクを定義する一般的な「BoxItemTasks」テーブルを作成することでしたが、それでも日付とユーザーの情報を個別に保存する必要があるため、あまり役に立ちませんでした。
私の 2 番目の考えは、おそらくそれは問題ではないということでした。このテーブルに状態保持専用のフィールドが 40 以上あっても心配する必要はありません。しかし、それは保持する情報が多いように感じます。
とにかく、3番目のオプションが何であるか、または上記の2つのオプションのいずれかが実際に合理的であるかどうかについて、私は途方に暮れています. このワークフローは将来さらに複雑になる可能性があり、新しいタスクごとに、追跡をサポートするためだけに 3 ~ 4 つのフィールドを追加する必要があります。
この状況であなたはどうしますか?
これは、ORM を使用せずに構築された既存のシステムの保守であるため、ORM だけに任せることはできません。
編集:
Kev、あなたはこのようなことについて話しているのですか:
ボックスアイテム
(PK) BoxItemID
(その他関係ないもの)
BoxItemActions
(PK) BoxItemID
(PK) BoxItemTaskID
完成されました
完了日
ユーザー完了
BoxItemTasks
(PK) タスクタイプ
説明(必要であれば)
うーん...それはうまくいくでしょう...それは、どのアイテムがどの状態にあるかを確認するためにSQLクエリを実行する現在のアプローチを変更する必要があることを表していますが、長期的には、このようなものがよりうまく機能するように見えます(シリアライゼーションのアイデアが表すような根本的な設計変更を行うこと...時間があれば、そのようにしたいと思います.)
これはあなたがKinについて言及していたことですか、それとも私はそれを理解していませんか?
編集:ああ、現在の状態を判断するための「最後のアクション」についてもあなたのアイデアが見えます...私はそれが好きです! それは私にとってはうまくいくと思います...少し変更する必要があるかもしれません(ある時点でタスクが同時に発生するため)が、アイデアは良いもののようです!
EDIT FINAL:要約すると、将来、誰かが同じ質問でこれを調べている場合...システムに情報がクエリ可能なインターフェースに事前にロードされている場合(つまり、私が取り組んでいるアドホック システムのように、データベース自体を直接呼び出すわけではありません)。ご回答ありがとうございます。