0

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

我的想法是有一个历史表来存储:UserId、ObjectId、ActionName。UserId 和 ObjectId 是外键。我在正确的轨道上吗?

4

3 回答 3

1

如果只应跟踪对特定字段的更改,例如用户表中的状态,我将使用通过外键从用户表引用的 user_status_histories 表。user_status_histories 表将包含诸如 current_status、date 和诸如 admin_who_modified_the_status 之类的字段。

每当进行状态更改时,都会将一条新记录插入到 user_status_histories 表中。这将允许轻松查询所有状态更改。

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

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

于 2012-10-07T15:57:14.150 回答
1

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

于 2012-10-07T16:01:27.713 回答
0

是的,你是。另一个非常相似的框架是支持撤消和重做的框架。这些框架跟踪用户操作,并具有将状态恢复到用户操作之前的状态的额外能力。

于 2012-10-07T15:43:09.220 回答