针对不同类型实体的可扩展审批流程的系统设计

System design for an extendable approval workflow for different type of entities

我正在寻找一种有效的方法来为我域中的某些实体创建草稿和启动审批工作流程。用户应轻松跟踪更改并批准或拒绝更改。您能否建议一个通用模型/方法/路线图来轻松提供这些功能?

假设我有这个模型:

public class CourierDistributionArea
{
    public City City { get; set; }
    public Courier Courier { get; set; }
}

public class City
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Courier
{
    public int Id { get; set; }
    public string Name { get; set; }
}

假设用户添加、更新或删除了一些 CourierDistributionArea 实体。您将如何存储这些实体的新待批准版本?您将如何设计此系统以轻松添加要在此审批工作流程中使用的新型实体?您将如何向最终用户展示变更集?

有很多选项,这些选项取决于您的用户可能做出的更改、多个用户是否可以同时提供替代草稿以及您要使用的存储空间(我无知地假设一些 table-based RDBMS like SQL Server).

1。草稿 Table(s)

Car table 旁边创建一个 CarDraft table。目标 table 中的所有列都应出现在草稿 table 中,以及与草稿本身相关的元数据所需的任何其他列。草稿获得批准后,将相关列更新到目标 table 并删除草稿。

优点

  • 无需在同一个实体中支持多个版本table
  • 草稿不会以任何方式影响目标 table 上的 OLTP

缺点

  • 额外table 维护

2。版本化实体

在您的目标 table 上创建 VersionPublished 列并放宽对使用原始主键强制执行单行的限制,而不是允许多行,但只有一个Published 列设置为 true。

优点

  • 无需额外 table 维护
  • 无需写入行两次(只需删除旧行并在单个事务中翻转新行的 Published 位)

缺点

  • 可能更复杂的约束/应用程序验证
  • 加入 Published 列时的额外检查(容易忘记)

3。转型批准

同样,根据用户可以执行的修改实体的操作,您可以将更改操作本身而不是新状态存储为草稿。这可以存储在 CarModifications table 中,例如,可能作为部分 JSON 对象,或作为数字或行,每个代表目标上列的值更改table。如果需要,可以将多行分组为单个 OperationId。

优点

  • 目标无变化table
  • 跨多个 table 的多个更改可以键入单个操作 ID 并应用到事务中

缺点

  • 更复杂的建模
  • 更复杂的验证