我想使用关系数据库实现批准拒绝工作流程。目前我正在使用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.使用相同的表,但创建重复的行,跟踪父行并对批准/拒绝做适当的更改。
专业人士:减少不必要的表格和域类
缺点:管理真的很复杂
我认为这种情况非常普遍,必须有一些材料/框架/架构来解决这个问题。虽然即使经过谷歌搜索后我也无法找到任何相关信息......
请帮忙......
答案 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为新表中的数据,并从新表中删除记录。