Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 管理更新审阅发布工作流的最佳方法?_Database Design - Fatal编程技术网

Database design 管理更新审阅发布工作流的最佳方法?

Database design 管理更新审阅发布工作流的最佳方法?,database-design,Database Design,我管理一个在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们想添加一个验证步骤:Tom进行更改,Jerry批准 我看到两条路,但两条都不雅观 保留整个数据库的第二个“工作副本” 在同一数据库中保留第二组“脏”表 这两种方法似乎都需要大量代码来进行内务管理,而且每当表的结构发生变化时,都需要加倍的工作 有更好的办法吗?如果有关系,DBMS是SQL Server,web应用程序是asp.net 编辑以添加: 我上面概述的两个更改都与现有代码向后兼容。我知道我将不得不做一些更改,但我不能更

我管理一个在线目录。目前,内部人员手动更新,他们的更改立即可见。现在我们想添加一个验证步骤:Tom进行更改,Jerry批准

我看到两条路,但两条都不雅观

  • 保留整个数据库的第二个“工作副本”
  • 在同一数据库中保留第二组“脏”表
  • 这两种方法似乎都需要大量代码来进行内务管理,而且每当表的结构发生变化时,都需要加倍的工作

    有更好的办法吗?如果有关系,DBMS是SQL Server,web应用程序是asp.net

    编辑以添加:

  • 我上面概述的两个更改都与现有代码向后兼容。我知道我将不得不做一些更改,但我不能更改每个查询

  • 我认为我的主要限制条件禁止简单地克隆行并将它们标记为“挂起”

  • 假设SupplierID为99的供应商有两种产品。(产品只能属于一个供应商ID。)供应商的电话号码已更改,因此我克隆供应商记录,更改电话号码,并将其标记为“待定”。但新记录的ID不能为99,因此无法再将其连接到其产品,甚至无法连接到它打算替换的记录


    我想我可以添加一个不受约束的标识符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通常会批准自己的工作。这不是问题。这也是我的方法,还有一个额外的步骤,即启用更改跟踪,以便可以撤消被拒绝的更改。我不确定这将如何映射到多表情况(有关详细信息,请参见我的编辑),当然这需要更改现有应用程序中的每个查询。