实施“软”保存或修改工作流程的最佳方法是什么?

时间:2009-05-03 20:18:11

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

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

只有一张表必须发生这种情况,比如“事件”:

活动  - ID   - 名称VARCHAR   - start_date DATETIME   - 来宾INTEGER

每当某个事件的某个属性被“普通”用户修改时,在这个“超级”用户进行修订(以及可能的批准)之前,这些更改都不会正式生效。

起初我虽然有以下几种选择:

  • 复制除id之外的每个列,例如name_temp为“name”,以保留待批准的修改。
  • 创建一个具有重复结构的单独表格,并保留所有待批准的修改。

你以前实现过这个吗?您认为最好/您的方式是什么?还有:这种问题有什么模式吗?

感谢!!!

PD:我需要保留“旧”记录,直到新的记录获得批准为止。

4 个答案:

答案 0 :(得分:0)

为什么不再添加一个名为IsApproved的列? bool或tinyint(1)类型?刚刚展示批准的活动?

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

首选是非常反对数据库规范化,因此将来添加更多属性会带来麻烦。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

让我加入对“第二桌”方法的投票 - 正如其他受访者所说的那样,它超越了将“建议的更改”强加到主表中的尝试(这会使其架构变得复杂,每个查询都会对其进行复杂化)等等。)

将所有预期的更改写入辅助表并对其进行处理(如果它们满足某些条件,则将它们应用于主表)“批量”以后确实是一种常见的模式,当您需要主表仅在某些时候提议的更改可以在任何时间进行,也可以在其他条件下进行,例如当写入主表非常昂贵(锁争用或其他)时,写N更改并不比写一个更昂贵,或者验证建议的更改非常耗时(您可以将您的用例分类为极端情况后一类,因为在你的情况下验证需要人来看待提议的改变 - 计算机标准确实很慢; - )。

答案 3 :(得分:0)

如果历史或版本控制很重要,结合批准,我会选择一个表格。您可以添加修订号,该修订号可以与现有主键一起使用,并且可以在每个修订版上增加。然后,您可以添加状态字段以显示当前版本,过期版本和需要批准版本。状态和关键字段的一个很好的索引将获得快速的结果。如果这只是一个,两个或三个字段中的一个,那么处理这些未经批准的编辑的特定表可能会更好,如上所述。