我想使用关系数据库实现批准拒绝工作流。目前我正在使用 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.create another table which is replica of original table to maintain the edited entries/ approval workflow. just .
pros: easy to manage, just replace replace the original entry in case of approval, delete in case of reject
cons: too many duplicate tables + similar number of duplicate domain classes
或
2.use same table, but create duplicate row, which keep track of the parent row and does appropriate changes on approval/rejection.
pros: reduces unnecessary tables & domain classes
cons: really complex to manage
我认为这种情况很常见,必须有一些 Material /框架/架构来解决这个问题。虽然我在谷歌上搜索了很多次之后也找不到任何相关的东西......
请帮忙...
最佳答案
一个对象:表+ View
首先,定义一个(单个)表。这是伪代码——我在猜测你的数据类型并忽略了可空性,你需要解决这个问题:
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
)
然后定义一个 View :
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
如果需要,作为标准代理键。
如果您需要快速访问实时数据集,您可以在 View 上构建聚集索引,但这也很困难。
关于sql-server - 数据库批准拒绝工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954439/