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

Edg*_*ona 12 database workflow refactoring database-design

我有一个关于如何处理存储复杂工作流状态以便在数据库中处理任务的最佳实践的问题.我一直在网上看无济于事,所以我想我会问社区他们认为最好的.

这个问题出自我在先前问题中给出的相同"BoxItem"示例.在我的系统中跟踪这个"BoxItem",因为它上面执行了各种任务.任务可能会持续几天并且与人工交互,因此BoxItem的状态必须保持不变.谁完成了任务(如果适用),并且还必须跟踪任务完成的时间.

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

TaskName是否完整

日期任务名称完成

用户任务名称完成

这在工作流程很简单时起作用......但现在它已经发展成一个复杂的过程(流程中> 10个可能的人类交互...其中大约一半是可选的,可能或可能不会为BoxItem完成,这导致我开始添加"Do TaskName "字段以及那些可选任务),我发现应该是一个简单的表现在有40个左右的字段专门用于保留这个状态信息.

我发现自己在问是否有更好的方法来做到这一点......但我不知所措.

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

我的第二个想法是,也许这无关紧要,我不应该担心这张桌子有40个或更多的字段用于保留国家......而且我可能只是偏执狂.但感觉这就是要保留的大量信息.

无论如何,我不知道第三种选择可能是什么,或者上述两种选择中的一种是否合理.我可以看到这个工作流程在将来可能变得更加复杂,而且对于每个新任务,我需要添加3-4个字段以支持跟踪它...感觉它正在失控.

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

我应该注意到这是现有系统的维护,一个没有ORM的系统,所以我不能把它留给ORM来处理它.

编辑:

凯夫,你在谈论做这样的事情:

BoxItems

(PK)BoxItemID

(其他不相关的东西)

BoxItemActions

(PK)BoxItemID

(PK)BoxItemTaskID

完成了

DateCompleted

UserCompleted

BoxItemTasks

(PK)TaskType

描述(如果有必要的话)

嗯...那会起作用......它代表需要改变我目前处理SQL查询的方式,看看哪些项目处于什么状态,但从长远来看,这样的事情看起来会更好(没有做一个基本的设计改变,比如序列化的想法代表......虽然如果我有时间,我想按照我的想法这样做.).

这就是你提到Kin的原因,还是我对它的关注?

编辑:啊,我看到你的想法与"最后的行动",以确定当前的状态...我喜欢它!我认为这可能对我有用......我可能需要稍微改变它(因为在某些时候任务同时发生),但这个想法似乎是一个好主意!

EDIT FINAL:所以总结一下,如果其他人在将来用同样的问题来看这个......如果你的系统将信息预先加载到某个可查询的界面中,那么序列化方法会很有用(即不是直接调用数据库本身,就像我正在研究的ad-hoc系统那样,但是如果你没有这个,那么附加表的想法似乎应该运行良好!谢谢大家的回复!

Kev*_*Kev 4

如果我理解正确,我将添加 BoxItemTasks 表(只是一个枚举表,对吧?),然后添加一个 BoxItemActions 表,其中包含 BoxItems 的外键和 BoxItemTasks 的外键以了解其是什么类型的任务。如果您想让特定任务只能对特定框项目执行一次,只需将 (Items + Tasks) 列对作为 BoxItemActions 的主键即可。

(你把它写得比我好得多,并且正确地解释了我所说的内容,这值得称赞。你写的正是我所想象的。)

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