Database design 管理更新审阅发布工作流的最佳方法?
我管理一个在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们想添加一个验证步骤:Tom进行更改,Jerry批准 我看到两条路,但两条都不雅观Database design 管理更新审阅发布工作流的最佳方法?,database-design,Database Design,我管理一个在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们想添加一个验证步骤:Tom进行更改,Jerry批准 我看到两条路,但两条都不雅观 保留整个数据库的第二个“工作副本” 在同一数据库中保留第二组“脏”表 这两种方法似乎都需要大量代码来进行内务管理,而且每当表的结构发生变化时,都需要加倍的工作 有更好的办法吗?如果有关系,DBMS是SQL Server,web应用程序是asp.net 编辑以添加: 我上面概述的两个更改都与现有代码向后兼容。我知道我将不得不做一些更改,但我不能更
我想我可以添加一个不受约束的标识符SupplierPseudoID,但这似乎与上述想法一样复杂且容易出错。为什么需要表的副本?为什么不在表中添加一个
approved
字段呢
对编辑的答复: 如果你有一张像这样的桌子
id | name | text | modified | etc
-----------------------------------
1 | aaaa | blabla | 20100210 | xxx
2 | bbbb | yadayada| 20100212 | yyy
3 | cccc | asdfkad | 20090102 | zzz
您只需修改它,添加一个名为approved
的新字段,并将主键设置为id
和modified
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | asdfkad | 20090102 | zzz | 1
3 | cccc | qwerklj | 20100219 | zzz | 0
您创建的视图只会为您带来
id | name | text | modified | etc
-----------------------------------
1 | aaaa | blabla | 20100210 | xxx
2 | bbbb | yadayada| 20100212 | yyy
3 | cccc | asdfkad | 20090102 | zzz
通过将其定义为从catalog WHERE approved=1中选择id、name、text、modified等代码>,这样您只需修改查询从中选择的“表”。为了避免修改插入,您应该给approved一个默认值0
,并修改更新查询以执行以下操作
INSERT INTO catalog (id, name, text, modified, etc, approved)
VALUES (SELECT id, name, text, NOW(), etc, 0)
最终会有类似的结果
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | asdfkad | 20090102 | zzz | 1
3 | cccc | qwerklj | 20100219 | zzz | 0
而“批准一个字段”所需的新接口必须
UPDATE catalog SET approved = 1;
DELETE FROM catalog WHERE id = @id AND approved = 1 AND MIN(modified);
这将导致
id | name | text | modified | etc | approved
-----------------------------------------------
1 | aaaa | blabla | 20100210 | xxx | 1
2 | bbbb | yadayada| 20100212 | yyy | 1
3 | cccc | qwerklj | 20100219 | zzz | 1
如果您使用触发器或存储过程来执行此操作,则最后一位可以简化得更多
这是一个非常模糊的示例,适合您的需要。我会有一个approved字段,该字段上会有一个触发器,将对approved状态的更改限制为仅来自具有指定approver角色的用户(如果您的用户没有角色或组类型,您也需要这样做,以便知道谁是授权用户和批准者。这样,如果Sam尝试批准自己的更改,就不会发生这种情况。我可能还会有一种检查机制,以确保进行更改的批准者必须获得其他人的批准精神病人
您的应用程序还必须进行更改,以便目录的普通用户只能看到已批准的更改,除非他们是发起更改的人或批准人。只需使用状态对重要表进行版本设置即可
同一张桌子,只是多了几行。
向表中添加“生效日期”范围
select * from catalog where item_code = '1234' and status = 'APPROVED' and
today >= start_date and (today <= end_date or end_date is null)
从目录中选择*,其中项目代码为“1234”,状态为“已批准”,并且
今天>=开始日期和时间(今天,当谈论数据库设计时,请始终记住:规范化,直到它受伤,反规范化,直到它起作用。请参阅上面的“我的编辑”。对于它的价值,数据库是完全规范化的,我不知道反规范化将如何帮助我;但我愿意学习。@egrunin:这只是一句老话。通过复制表/数据库,你正在反规范化一个数据库这通常不是一个好主意。反规范化通常是为了提高性能,但应该谨慎地进行。感谢您提供的详细答案。[1]我会批准它,这样其他人就可以看到它,即使它对我来说真的不起作用——它需要对应用程序中的每个查询进行重大更改,而且它们已经非常复杂。我可以在下一次从零开始使用它[2]我发现的(或者更确切地说,找到的“相关”侧边栏)一个类似的问题,答案更适用于我的情况:。感谢所有回复者。事实上,每个人都会编辑,有些人可以批准,因此Sam通常会批准自己的工作。这不是问题。这也是我的方法,还有一个额外的步骤,即启用更改跟踪,以便可以撤消被拒绝的更改。我不确定这将如何映射到多表情况(有关详细信息,请参见我的编辑),当然这需要更改现有应用程序中的每个查询。