Database design 帮助CRUD程序员思考一个;审批工作流程“;

Database design 帮助CRUD程序员思考一个;审批工作流程“;,database-design,database-schema,Database Design,Database Schema,我一直在开发一个web应用程序,它基本上是一个CRUD应用程序(创建、读取、更新、删除)。最近,我开始研究我所谓的“审批工作流”。基本上,为物料生成请求,然后发送给经理进行批准。根据请求的内容,不同的人需要批准请求,或者可能将请求发送回请求者进行修改。批准者需要跟踪批准内容,请求者需要查看其请求的状态 作为一名“CRUD”开发人员,我很难思考如何设计这个。我应该有哪些数据库表?如何跟踪请求的状态?我应该如何通知用户其请求发生的操作 他们的设计模式能帮我解决这个问题吗?我应该在代码中绘制状态机吗

我一直在开发一个web应用程序,它基本上是一个CRUD应用程序(创建、读取、更新、删除)。最近,我开始研究我所谓的“审批工作流”。基本上,为物料生成请求,然后发送给经理进行批准。根据请求的内容,不同的人需要批准请求,或者可能将请求发送回请求者进行修改。批准者需要跟踪批准内容,请求者需要查看其请求的状态

作为一名“CRUD”开发人员,我很难思考如何设计这个。我应该有哪些数据库表?如何跟踪请求的状态?我应该如何通知用户其请求发生的操作

他们的设计模式能帮我解决这个问题吗?我应该在代码中绘制状态机吗


我认为这是一个通用的编程问题,但如果有什么不同的话,我将Django与MySQL结合使用。

有一些设计模式。也许他们会有点帮助:

工作流比简单的CRUD应用程序更受状态驱动,因此,阅读状态机模式也会有所帮助。听起来你走对了方向

至于数据建模,您可以有一个包含所有“批准”的表,其中的state字段是states表的外键


至于通知,这是您的应用程序在更改审批状态时必须执行的操作,它必须在其他地方查找特定状态更改需要通知的人/内容(因此,您必须跟踪哪些实体因哪些状态更改而收到通知)。

审批==状态更改

State Change==更新更改的内容&&创建日志以记录更改的内容

就这样

有趣的规则是“谁可以做更新?”,“哪些状态更改是合法更新?”,以及“哪些状态是死胡同?”


你在建造一个有限自动机。状态是对象的属性。您可以通过更新其状态来“通过工作流”推送某些内容。

我现在在一个类似的项目中(不同的平台/DB)

我有一个DB应用程序,它具有不同级别的用户权限,可以对哪些类型的记录进行CRUD。在大多数情况下,我控制代码中允许的操作


然而,对于许多构造,我有一个构造的“状态代码”,然后定义(同样,在代码中)谁可以对该构造做什么,以及他们可以将其移动到什么状态代码。

正如许多人所说,批准它就是将其移动到一个新状态

<>我考虑到的是,我经常发现用户希望在同一个“状态”中有东西,但也记录了在这个状态下事情在不同的步骤或任务。例如,用户可能希望区分“已请求”和“正在处理”。从批准的角度来看,请求的和正在进行的都是未批准的(打开)。如果某些内容从“已批准”变回“未批准”(打开),他们可能会称之为“需要审查”——但它仍然未批准

所以你可能想要这样的东西:

当前任务:状态 请求:打开

正在处理:打开

所需审查:开放

已批准:已批准


随着时间的推移,用户可能需要更多的“模式”或“任务”。如果你为其中每一个做了一个状态,你最终可能会得到比你或他们真正想要的复杂得多的结果。如果您让用户拥有他们想要的任意多个“模式”或“任务”,并与状态建立多对一的关系,那么从您的角度来看会更简单,但从用户的角度来看会更精确。

这是我们经常遇到的问题,因此我们制作了一个通用路由系统。对于你正在做的事情来说,这可能是矫枉过正,但欢迎你挖掘它来获取想法。它允许使用链(顺序批准)或星(广播)将任意内容路由到任意用户,并使用最小投票进行批准。是模式的自动生成ERD

基本上,我们有一个包含一个或多个路由方案列表的路由方案。每个列表可以是链或星,整个方案可以作为链或星启动。每个名单和整个计划都有自己的投票权。这意味着您可以有一个类型为“star”的方案,它有两个列表,一个是star,一个是chain。整个方案可以有1票对1票的赞成票,因此,如果任一列表赞成,则整个工作流被赞成。链列表的投票数可以等于成员数,因此每个成员都必须在下一个成员投票之前进行批准,而第一个不批准的成员将杀死该列表。在星号列表中,您可以对1进行投票,以便该列表中的任何人都可以立即批准整个工作流

这些方案将无限期保存,并可在设置后重新使用。要实现方案,路由表中的一个条目将包含方案id、要路由的内容以及一些细节,如批准和不批准文本。然后,“路由”表存储已实现方案的状态


我们使用跨应用程序事件系统发送电子邮件,或在路由状态发生变化时通知其他应用程序。

我现在不喜欢自动格式化程序。自动生成的ERD已消失:-(以下是我在django进行的一些调查,我们在状态处理方面所做的工作-