sql-server - 数据库批准拒绝工作流程

标签 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.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/

相关文章:

sql-server - 一旦结果集包含某个值,就退出递归公用表表达式

mysql - 我如何在 MYSQL Select 中执行 .find?

java - 使用 like 运算符搜索 MySql 数据库关键字

c# - NHibernate QueryOver - 日期比较表达式

sql - SQL 中的 SELECT 语句中的 EXEC

asp.net - sql server 2008 用户登录失败 'NT AUTHORITY\NETWORK SERVICE'

mysql - 有没有办法在 SQL 数据库的一个字段中插入多个数据?

c# - NHibernate 演示文稿的一个很好的示例域是什么?

NHibernate vs Entity Framework 5 自动连接实体

sql-server - TypeORM 处理数据库中断