【问题标题】:What's the best way to implement a "soft" save or modification workflow?实施“软”保存或修改工作流程的最佳方式是什么?
【发布时间】:2009-05-03 20:18:11
【问题描述】:

我正在 LAMP 上开发一个基于 MVC 的 Web 应用程序,该应用程序需要在“高级”用户的批准下才能修改一些记录。 (普通用户可以提交更改,但只有在此批准后才能应用)

只有一个表必须在其中发生,比如“事件”:

活动 - ID - 名称 VARCHAR - 开始日期日期时间 - 来宾整数

每次“普通”用户修改事件的属性之一时,这些更改在此“超级”用户修改(和可能的批准)之前不会正式生效。

起初我想到了以下选项:

  • 复制除 id 之外的每一列,例如 name_temp 表示“名称”,以保存待批准的修改。
  • 创建一个具有重复结构的单独表,并在其中保存所有待批准的修改。

您以前是否实施过此操作?你认为最好的/你的方法是什么?还有:这类问题有什么规律吗?

谢谢!!!

PD:我需要将“旧”记录保留在原处,直到新记录获得批准..

【问题讨论】:

  • 你能改一下标题吗?

标签: php mysql database database-design design-patterns


【解决方案1】:

让我对“第二张表”方法投一票——正如其他两位受访者所说,它比试图将“提议的更改”硬塞到主表中(这会使它的架构复杂化,每个查询都复杂化)等)。

将所有预期的更改写入辅助表并稍后“分批”处理它们(如果它们满足某些条件,则将它们应用到主表)确实是一种常见的模式,当您只需要更改主表时通常很有用某些时间,而提议的更改可以随时出现,也可以在其他条件下出现,例如当写入主表的成本非常高(锁争用或其他)但写入 N 个更改并不比写入一个更昂贵,或者验证提议的更改非常耗时(您可以将您的用例归类为后一类,因为在您的情况下,验证需要人工查看提议的更改——按照计算机标准,这确实非常慢;-)。

【讨论】:

    【解决方案2】:

    如果只是关于添加新事件的权限,我会使用一个额外的布尔列,即 is_approved 或类似的。

    虽然可以进行编辑,但在我看来,复制同一个表中的每一列来存储临时值是一个很大的禁忌。想象一下当两个用户将他们的更改发布到同一个事件时会发生什么。

    选项二,即单独的表,是一个更好的选择。您可以将每次尝试存储在那里并相应地更新您的主表。

    使用这种方法,甚至可以进行某种形式的回滚更改。请确保为每个内容存储一个时间戳,并且永远不要删除您已批准的编辑。

    【讨论】:

      【解决方案3】:

      为什么不再添加 1 个名为 IsApproved 的列? bool 还是 tinyint(1) 类型?现在才显示已批准的事件?

      编辑:哦,这是每个属性的批准。然后第二张桌子是我的选择 命名为 PendingEventChanges 具有相同的结构或只是 id+可更改的属性,并且在批准后,“超级”用户将更新原始数据并从待处理中删除 etries。

      第一选择非常反对数据库规范化,所以将来添加更多属性会带来麻烦。

      【讨论】:

      • 因为我需要保留当前记录以防新更改未获得批准..
      【解决方案4】:

      如果历史记录或版本控制很重要,再加上批准,我会选择一张桌子。您将添加一个修订号,它可以与您现有的主键一起使用,并且可以在每次修订时递增。然后,您可以添加一个状态字段来显示当前版本、过期版本和需要批准的版本。状态和关键字段上的一个很好的索引将为您提供快速的结果。如果这只是众多字段中的一个、两个或三个字段,那么按照上面的建议,处理这些未经批准的编辑的特定表可能会更好。

      【讨论】:

        猜你喜欢
        • 2017-05-17
        • 1970-01-01
        • 2010-09-20
        • 2010-09-17
        • 2017-11-19
        • 2019-01-29
        • 2017-12-18
        • 2022-11-09
        • 1970-01-01
        相关资源
        最近更新 更多