我有一个关于如何存储复杂工作流状态以在数据库中处理任务的最佳实践的问题。我一直在网上寻找无济于事,所以我想我会问社区他们认为什么是最好的。
这个问题来自我在上一个问题中给出的同一个“BoxItem”示例。这个“BoxItem”在我的系统中被跟踪,因为它执行了各种任务。该任务可能会持续数天并需要人工交互,因此必须保持 BoxItem 的状态。还必须跟踪谁完成了任务(如果适用)以及任务完成的时间。
起初,我通过在“BoxItems”表中为每个需要完成的人工交互任务添加三个字段来解决这个问题:
任务名称是否完整
日期TaskName完成
用户任务名完成
当工作流程很简单时,这很有效……但现在它已经发展成为一个复杂的流程(流程中可能有 10 个以上的人机交互……其中大约一半是可选的,可能会或可能不会针对 BoxItem 完成,这导致我开始为那些可选任务添加“Do TaskName ”字段),我发现应该是一个简单的表现在有 40 个左右的字段完全用于保留此状态信息。
我发现自己在问是否有更好的方法来做到这一点......但我不知所措。
我的第一个想法是制作一个通用的“BoxItemTasks”表,它定义了可以在给定盒子上完成的任务,但我仍然需要单独保存日期和用户信息,所以它并没有真正帮助。
我的第二个想法是,也许这无关紧要,如果这张表有 40 个或更多用于状态保留的字段,我不应该担心......也许我只是偏执。但感觉要保留很多信息。
无论如何,我不知道第三种选择可能是什么,或者上述两种选择中的一种是否真的合理。我可以看到这个工作流程在未来可能会变得更加复杂,对于每一个新任务,我需要添加 3-4 个字段来支持它的跟踪......感觉就像它正在失控。
在这个情况下,你会怎么做?
我应该注意,这是对现有系统的维护,它是在没有 ORM 的情况下构建的,所以我不能把它留给 ORM 来处理。
编辑:
凯夫,你是在谈论做这样的事情:
盒子物品
(PK) BoxItemID
(其他无关的东西)
BoxItemActions
(PK) BoxItemID
(PK) BoxItemTaskID
完成了
完成日期
用户已完成
BoxItemTasks
(PK) 任务类型
描述(如果有必要)
嗯......这会起作用......它代表需要改变我目前执行 SQL 查询的方式以查看哪些项目处于什么状态,但从长远来看,这样的事情看起来会更好(没有进行像序列化想法所代表的基本设计更改......虽然如果我有时间,我想按照我的想法去做。)。
这就是你提到的Kin,还是我不同意?
编辑:啊,我也看到了你的想法,用“最后一个动作”来确定当前状态......我喜欢它!我认为这可能对我有用......我可能需要稍微改变一下(因为在某些时候任务会同时发生),但这个想法似乎是个好主意!
编辑最后:总而言之,如果其他人在未来用同样的问题来查找这个......听起来如果您的系统将信息预加载到某个可查询的界面中(即不直接调用数据库本身,就像我正在处理的临时系统那样),但如果你没有那个,附加表的想法似乎应该很好用!谢谢大家的回复!