- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
10 个月前关闭。
Improve this question
我有一个关于最佳实践的问题,即如何在数据库中存储复杂的工作流状态以处理任务。我一直在网上寻找无济于事,所以我想我会问社区他们认为什么是最好的。
这个问题来自我在上一个问题中给出的同一个“BoxItem”示例。这个“BoxItem”正在我的系统中被跟踪,因为在它上面执行了各种任务。任务可能会在几天内进行,并且需要人工交互,因此必须保留 BoxItem 的状态。谁完成了任务(如果适用)以及任务何时完成也必须被跟踪。
起初,我通过为每个需要完成的人工交互任务向“BoxItems”表添加三个字段来解决这个问题:
IsTaskNameComplete
日期任务名称完成
用户任务名称完成
这在工作流程简单时有效......但现在它已经发展成为一个复杂的过程(流程中有 > 10 种可能的人工交互......其中大约一半是可选的,并且可能会或可能不会为 BoxItem 完成,这导致我开始为那些可选任务添加“DoTaskName”字段),我发现应该是一个简单的表现在有 40 个左右的字段完全用于保留此状态信息。
我发现自己在问是否有更好的方法来做到这一点......但我不知所措。
我的第一个想法是制作一个通用的“BoxItemTasks”表,它定义了可以在给定盒子上完成的任务,但我仍然需要单独保存日期和用户信息,所以它并没有真正帮助。
我的第二个想法是,也许这无关紧要,如果这张表有 40 个或更多字段专门用于状态保留,我不应该担心……也许我只是偏执了。但感觉要保留很多信息。
无论如何,对于第三种选择可能是什么,或者上述两种选择中的一种是否真的合理,我感到茫然。我可以看到这个工作流程在 future 可能会变得更加复杂,对于每个新任务,我将需要添加 3-4 个字段来支持它的跟踪......感觉它正在失控。
在这个情况下,你会怎么做?
我应该注意,这是对现有系统的维护,一个没有 ORM 构建的系统,所以我不能把它交给 ORM 来处理。
编辑:
Kev,你是在说做这样的事情吗:
盒子物品
(PK) BoxItemID
(其他无关内容)
BoxItemActions
(PK) BoxItemID
(PK) BoxItemTaskID
完成了
完成日期
用户完成
BoxItemTasks
(PK) 任务类型
描述(如果有必要)
嗯……那会起作用……这代表需要改变我目前执行 SQL 查询的方式以查看哪些项目处于什么状态,但从长远来看,这样的事情看起来会更好(无需进行像序列化想法所代表的基本设计更改......不过如果我有时间,我想按照我的想法来做。)。
所以这就是你提到的 Kin,还是我不同意?
编辑:啊,我也看到你的想法和“最后行动”来确定当前状态......我喜欢它!我认为这可能对我有用......我可能需要稍微改变一下(因为在某些时候任务会同时发生),但这个想法似乎是个好主意!
编辑最终版:总而言之,如果将来有人用同样的问题来查找这个问题......听起来序列化方法会很有用,如果您的系统将信息预加载到某些可查询的界面中(即不直接调用数据库本身,就像我正在使用的临时系统所做的那样),但如果你没有,附加表的想法似乎应该很好用!谢谢大家的回复!
最佳答案
如果我理解正确,我会添加 BoxItemTasks 表(只是一个枚举表,对吗?),然后是一个 BoxItemActions 表,其中包含指向 BoxItems 和 BoxItemTasks 的外键,表示它是什么类型的任务。如果您想让特定任务只能在特定框项目上执行一次,只需将 (Items + Tasks) 列对作为 BoxItemActions 的主键即可。
(你把它布置得比我好得多,并且感谢正确解释我所说的。你写的正是我所描绘的。)
至于确定当前状态,您可以在 BoxItemActions 上编写一个触发器来更新单列 BoxItems.LastAction。对于并发操作,您的触发器可能只有特殊情况来决定哪个操作最近一次。
关于database - 最佳实践 : Storing a workflow state of an item in a database?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/116762/
我是一名优秀的程序员,十分优秀!