最佳实践:将项目的工作流程状态存储在数据库中?

时间:2020-03-06 14:33:27  来源:igfitidea点击:

我有一个关于最佳实践的问题,该最佳实践涉及应如何存储复杂的工作流状态以处理数据库中的任务。我一直在网上寻找无济于事,所以我想问一下社区,他们认为最好的是什么。

这个问题来自我在前面的问题中给出的" BoxItem"示例。随着在系统上执行各种任务,该" BoxItem"正在我的系统中被跟踪。该任务可能需要几天的时间,并且需要人工干预,因此BoxItem的状态必须保持不变。还必须跟踪谁完成了任务(如果适用)以及完成任务的时间。

首先,我通过为每个需要完成的人机交互任务在" BoxItems"表中添加三个字段来解决这个问题:

IsTaskNameComplete

DateTaskNameComplete

UserTaskNameComplete

当工作流程很简单时,此方法就可以工作了……但是现在,它已经发展为一个复杂的流程(流程中有10种以上的可能的人工交互……其中约有一半是可选的,对于BoxItem可能会或者可能不会完成)这导致我也开始为那些可选任务添加" DoTaskName"字段),我发现原本应该是一个简单表的表现在有40个左右的字段专门用于保留此状态信息。

我发现自己在问是否有更好的方法来做……但是我很茫然。

我的第一个想法是制作一个通用的" BoxItemTasks"表,该表定义了可以在给定盒子上完成的任务,但是我仍然需要分别保存日期和用户信息,因此它并没有真正的帮助。

我的第二个想法是,也许这并不重要,并且我不必担心该表是否有40个或者更多字段专门用于保留状态……也许我只是偏执。但这感觉上要保留很多信息。

无论如何,我对第三个选择可能是茫然无措,或者上述两个选择之一实际上是合理的。我可以看到这个工作流程将来可能变得更加复杂,对于每个新任务,我都需要添加3-4个字段以支持对其进行跟踪……感觉就像是一发不可收拾。

在这个情况下,你会怎么做?

我应该注意,这是对现有系统的维护,该系统是在没有ORM的情况下构建的,因此,我不能只将它留给ORM来处理。

编辑:

Kev,我们是在谈论做这样的事情:

BoxItems

(PK)BoxItemID

(其他无关紧要的东西)

BoxItemActions

(PK)BoxItemID

(PK)BoxItemTaskID

完成了

完成日期

用户完成

BoxItemTasks

(PK)任务类型

说明(如有必要)

嗯...这行得通...这将代表需要改变我目前处理SQL查询的方式,以查看哪些项目处于什么状态,但是从长远来看,这样的事情看起来会更好(无需使用进行基本的设计更改,如序列化的想法所表示的……虽然我有时间,但我还是想用我想的方式来做。)

那么,这是我们所说的Kin,还是我不赞成?

编辑:啊,我也可以通过"最后动作"来确定当前状态,也看到想法...我喜欢!我认为这可能对我有用...我可能需要对其进行一些更改(因为在某些时候任务同时发生),但是这个主意似乎不错!

编辑最后:总而言之,如果将来有人在同一问题上查找此问题……听起来,如果系统已将信息预加载到可查询的某个接口中(例如,序列化方法将非常有用)而不是像我正在使用的即席系统那样直接调用数据库本身),但是如果我们没有该功能,则添加表的想法似乎应该很好用!谢谢大家的回应!

解决方案

对于它的价值,在BizTalk中,它们通过将它们二进制序列化到数据库中来"脱水"长期运行的消息模式(工作流等)。

我想我会将Workflow对象序列化为XML,并使用ID列存储在数据库中。报告可能更困难,但听起来可能对我们而言有效。

如果我正确理解,我会添加BoxItemTasks表(只是一个枚举表,对吧?),然后添加一个BoxItemActions表,该表具有指向BoxItems和BoxItemTasks的外键,以表示任务类型。如果要使某个特定任务只能在特定的Box项目上执行一次,只需将(Items + Tasks)对列作为BoxItemActions的主键即可。

(我们提出的建议比我做的要好得多,并且能正确解释我在说的话也倍受赞誉。我们写的正是我所描绘的。)

至于确定当前状态,我们可以在BoxItemActions上编写触发器,以更新单个列BoxItems.LastAction。对于并发操作,触发器可能仅具有特殊情况来决定哪个操作需要新近度。

正如前面的答案所建议的,我会将桌子分成几张。

每次创建BoxItem时,都会创建BoxItemActions,其中包含工作流需要执行的操作的列表。在此表中,我们可以跟踪每个任务完成的详细日期,时间,用户。

使用这种类型的应用程序,知道Box下一步要去哪里会变得非常棘手,因此为Box保留剩余步骤的"地图"将证明很有帮助。同样,该表可以疯狂地分组,每个框数百行,并且仍然非常易于查询。

这也使得拥有可以轻松更改的"不同路径"成为可能。一种通过工作流程的"路径"主数据表是一种解决方案,其中,在创建每个框时,用户必须选择框将遵循的"路径"。或者,我们可以进行设置,以便在用户创建框时,他们选择此特定框所需的任务。取决于我们的业务问题。

对于此类问题,请考虑http://www.databaseanswers.org/data_models/workflow/index.htm中显示的数据库架构,该架构可对业务流程中的一系列事件进行建模。