是否有任何用于记录用户操作的启发式/模式

时间:2012-10-07 15:31:44

标签: java gwt logging

我有一个GWT / Java / Hibernate / MySQL应用程序(但我认为任何Web模式都可以有效)在几个对象上执行CRUD。每个对象都存储在数据库的表中。我想实现一个动作记录器。例如,对于对象A,我想知道谁创建了它并对其进行了修改,对于用户B,他执行了哪些操作。

我的想法是拥有一个存储以下内容的History表:UserId,ObjectId,ActionName。 UserId和ObjectId是外键。我是在正确的轨道上吗?

3 个答案:

答案 0 :(得分:1)

如果仅跟踪特定字段的更改(例如,用户表中的状态等),我将使用通过外键从users表引用的user_status_histories表。 user_status_histories表将包含诸如current_status,日期等字段,例如admin_who_modified_the_status。

每当进行状态更改时,都会在user_status_histories表中插入新记录。这样可以轻松查询所有状态更改。

当然,查询用户然后需要使用user_status_histories表进行(LEFT或INNER)JOIN以获取最后一条记录(=当前状态)。

根据您的需要,您可能会想到用户表中的current_status字段(除了用作外键的状态)以进行快速访问,该字段将与user_status_histories表保持并行。

答案 1 :(得分:1)

我也认为这是正确的方向。
但是,请记住,在具有大量流量的应用程序中,此日志可能会成为开销。 在这种情况下,我会建议以下内容 - A.不要使用hibernate进行这种“动作记录” - Hibernate对“大多数读取DB”具有更好的性能 B.考虑在动作记录表的“主要写入”场景中更好的DB。
您可以尝试为此寻找NoSQL解决方案。
C.如果你使用这样的NoSQL数据库,但仍然希望在关系数据库中保留日志记录操作,例如,有一个在一天中运行一次的脱机进程),那将查询“操作日志数据库”并将其插入到关系数据库。
D.如果您的系统可能丢失某些操作日志记录,请考虑使用生产者/消费者模式(例如 - 在生产者和消费者线程之间使用队列) - 需要记录操作的线程不会同步记录它们,但会记录他们是异步的。
E.此外,不要忘记这样的记录表有可能及时过度泛滥,导致查询需要很长时间。
对于这些问题,请考虑以下事项:
E.1。每天删除真正的旧日志 - 比方说 - 比月份更早,或将它们移动到某个“备份”表。
E.2索引一些主要用于操作日志记录查询的字段(例如 - 可能是action_type)字段。

答案 2 :(得分:0)

是的,你是。另一个非常相似的框架是支持undo和redo的框架。这些框架跟踪用户操作,并具有将状态恢复为用户操作之前的状态的附加功能。