【问题标题】:How to keep track of user changes to objects in a web application?如何跟踪用户对 Web 应用程序中对象的更改?
【发布时间】:2011-04-06 06:48:16
【问题描述】:

我需要帮助想出一种巧妙的方法来跟踪 Web 应用程序中的用户更改。

假设我们有这个场景:

  1. 用户 X 登录并更新其个人资料中的一些字段,比如电子邮件地址。
  2. 这会导致用户被标记为已更新,并应由管理员进行检查
  3. 在管理 UI 中,我们要突出显示修改后的字段

那么问题就变成了,跟踪这些变化的最佳方法是什么?管理员可能几天甚至几周都不会检查用户。我真的不需要保留原始值(至少在这一点上),我只想能够确定哪些字段已更改。在数据库中跟踪这一点的最佳方法是什么?

该应用程序是用 Java / JSF 编写的,带有 Hibernate 和 MySQL 用于数据访问和存储。

谢谢!

【问题讨论】:

  • 我不明白你为什么不需要“以前的版本”。如果管理员不能否决更新(因此将其恢复为以前的值),这意味着管理员的工作......没用?管理员看到更新后可以做什么?他们不需要查看之前的值来决定要做什么吗?
  • 基本用例是用户可以访问他们输入一些文本的文本字段。然后管理员将此文本映射到树中的项目,然后在内部用于搜索。因此,管理员无需查看原始值即可知道树中发生了哪些更改/需要更新。

标签: java mysql hibernate database-design


【解决方案1】:

根据您的用例,我会选择这样的东西:

创建一个具有以下结构的“日志”表:

Username|Fieldname        |Processed
Pamar   |Profile.Email    |No
Pamar   |Homepage.Blurb   |No

在您要跟踪的字段上设置触发器。每当修改“记录”字段时,触发器将创建一条指向用户和字段名称的记录。

应用程序的标记部分将允许管理员查询日志记录表(仅选择“未处理”记录)并一次处理一个或多个字段。 您没有提供有关标记/索引过程的太多详细信息,但该表应该足以正确识别更改的字段(您可以直接查询这些以访问当前值,这就是您所需要的)。在处理(索引)给定更新后,您可以将其“已处理”标志设置为“是”(或删除它,您的选择)。

您可以选择使用时间戳字段,例如,按照用户完成更新的相同顺序处理更新。

如果您甚至需要保留“以前的版本”,您只需将文本字段添加到当前结构并更新触发器,以便它们将旧值保存在其中。

【讨论】:

    【解决方案2】:

    看看Hibernate Envers。 -- 它提供审计和版本控制,但我的这对你的用例来说太胖了。

    【讨论】:

      【解决方案3】:

      您可以在数据库中创建一个表以进行更改...

      1. 在向数据库写入任何更改之前,运行选择查询以检索现有数据并比较两者(以查找更改)
      2. 将更改的字段写入表(id、时间戳、user_id、field、old_value、new_value)
      3. 这里发生了一些事情...要么是电子邮件警报,要么只是在管理员登录时,它会输出此表的条目,管理员可以在其中选择批准/忽略它们(从而从更改表中删除它们)。

      如果您不需要保留旧值,则只需省略更改表中的 old_value 列。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多