数据库批准拒绝WorkFlow

时间:2014-07-25 11:11:07

标签: sql-server database nhibernate workflow relational-database

我想使用关系数据库实现批准拒绝工作流程。目前我正在使用MS-SQL数据库和NHibernate。

示例:

假设我在数据库中有以下条目

ID  Name    Location    FromDate    ToDate  ApprovalStatus
1   ABCD    London       1-Jan      31-Dec  approved

现在登录的用户可以使用前端更改条目...将进行审批

ID  Name    Location    FromDate    ToDate  ApprovalStatus
1   ABCD    London      1-Jan       30-Jun  edited

如果权威机构批准编辑,则编辑应保留,但如果更改被拒绝,我想恢复旧条目。

实现这一点的方法很少,但是每个表都需要大量的样板代码,并且我有大约20-30个这样的实体遵循上面所示的批准过程。我能想到的选择是

  

1.创建另一个表,该表是原始表的副本,以维护已编辑的条目/批准工作流程。只是。

     

专业人士:易于管理,只需替换原来的条目   批准的情况下,拒绝的情况下删除

     

缺点:重复的表太多+重复的域数相似   类

OR

  

2.使用相同的表,但创建重复的行,跟踪父行并对批准/拒绝做适当的更改。

     

专业人士:减少不必要的表格和域类

     

缺点:管理真的很复杂


我认为这种情况非常普遍,必须有一些材料/框架/架构来解决这个问题。虽然即使经过谷歌搜索后我也无法找到任何相关信息......

请帮忙......

3 个答案:

答案 0 :(得分:3)

一个对象:表格+视图

首先,定义一个(单个)表。这是伪代码 - 我猜测你的数据类型并忽略了可空性,你需要解决这个问题:

CREATE TABLE EventData
 (
   ID              int
  ,Name            varchar(50)
  ,Location        varchar(50)
  ,FromDate        datetime
  ,ToDate          datetime
  ,ApprovalStatus  tinyint   --  Foreign key to a lookup table of valid editing statuses
  ,CreatedAt       datetime  DEFAULT CURRENT_TIMESTAMP
)

然后定义一个视图:

CREATE VIEW ApprovedEventData
AS
SELECT
  ID
 ,Name
 ,Location
 ,FromDate
 ,ToDate
FROM MyTable
WHERE ApprovalStatus = 1  --  Or whatever “Approved” is

每次创建条目时,都会添加一行。 每次更改条目时,都会添加一行 在任何给定的时间点,可能每个ID只能在一行上标记为“已批准”。 (管理和维护这可能很困难,并且超出了这个答案的范围。)

要访问所有当前已批准的项目:

SELECT * from ApprovedEventData

要按照创建顺序按ID访问所有输入的项目(即添加了指示状态的新行):

SELECT * from EventData order by ID, ItemCreated

正确地说,主键是ID + CreatedAt,假设给定ID的两个编辑事件不会同时发生。你可以扔进专栏

VersionID   int  identity(1,1)  --  Make this the primary key

如果需要,作为标准代理密钥。

如果您需要快速访问实时数据集,您可能可以在视图上构建聚簇索引,但这也可能变得困难。

答案 1 :(得分:1)

为什么没有一个额外的位列,它可以作为每个id的活动或非活动指示符。您只需在同一个表中包含旧记录和新记录,并只显示活动记录。可以将作业设置为每天运行,仅删除被拒绝的记录。这将允许您保存旧记录和新记录。如果新记录被批准,您还可以让作业删除旧记录(假设您不需要它们)。

所以我想说的是: 原表:

ID  Name    Location    FromDate    ToDate  ApprovalStatus  isActive
1   ABCD    London       1-Jan      31-Dec  approved          1

让我们说有人编辑了这个条目(你的桌子会是这样的) -

ID  Name    Location    FromDate    ToDate  ApprovalStatus  isActive
1   ABCD    London       1-Jan      31-Dec  approved          0
1   ABCD    London      1-Jan       30-Jun  edited            1

条目被拒绝:

ID  Name    Location    FromDate    ToDate  ApprovalStatus  isActive
1   ABCD    London       1-Jan      31-Dec  approved          1
1   ABCD    London      1-Jan       30-Jun  rejected          0

如果入境获得批准:

ID  Name    Location    FromDate    ToDate  ApprovalStatus  isActive
1   ABCD    London       1-Jan      31-Dec  approved          0
1   ABCD    London       1-Jan       30-Jun  approved         1

可以设置SQL作业以执行以下操作:

    DELETE FROM TableName where ApprovalStatus=rejected and isActive=0;
    GO

您可以根据日期时间(我假设您可能拥有)删除已批准的0条记录,因为您应始终考虑使用审计字段。如果没有,请使用isActive 0仔细删除所有已批准的记录。

 DELETE FROM TableName where ApprovalStatus=0 and isActive=0;

确保在删除之前进行一些测试,因为您可能会删除仍处于编辑阶段并且未被拒绝或批准的记录。

答案 2 :(得分:1)

如果要创建新表:

原始表(保持原样):

ID  Name    Location    FromDate    ToDate  ApprovalStatus
1   ABCD    London       1-Jan      31-Dec  approved
2   EFGH    New York     1-Jan      31-Dec  approved
3   IJKL    Berlin       1-Jan      31-Dec  approved

变更后的新表

ID  Name    Location    FromDate    ToDate  ApprovalStatus 
1   ABCD    London       1-Jan      31-Dec  edited
3   IJKL    Berlin       1-Jan      31-Dec  edited

拒绝后的新表格(如果需要,可以删除被拒绝的记录)

ID  Name    Location    FromDate    ToDate  ApprovalStatus 
1   ABCD    London       1-Jan      31-Dec  edited
3   IJKL    Berlin       1-Jan      31-Dec  rejected

批准后的新表格(如果需要,您可以删除已批准的记录)

ID  Name    Location    FromDate    ToDate  ApprovalStatus 
1   ABCD    London       1-Jan      31-Dec  edited
3   IJKL    Berlin       1-Jan      31-Dec  approved

批准时: 更新原始表,其中id为新表中的数据,并从新表中删除记录。