我有一个 GWT/Java/Hibernate/MySQL 应用程序(但我认为任何 Web 模式都可能有效),它对多个对象执行 CRUD。每个对象都存储在数据库的表中。我想实现一个 Action 记录器。例如,对于对象 A,我想知道谁创建了它并修改了它,对于用户 B,他执行了哪些操作。
我的想法是有一个历史表来存储:UserId、ObjectId、ActionName。 UserId 和 ObjectId 是外键。我走在正确的道路上吗?
最佳答案
我也认为这是正确的方向。
但是,请记住,在流量较大的应用程序中,此日志可能会产生开销。
在这种情况下我会建议以下 -
A. 不要使用 hibernate 进行此“操作日志记录” - Hibernate 对于“主要读取数据库”具有更好的性能
B. 考虑在操作日志表的“主要是写入”场景中更好的数据库。
您可以尝试为此寻找 NoSQL 解决方案。
C. 如果您使用此类 NoSQL 数据库,但仍希望将日志操作保留在关系数据库中,例如,有一个每天运行一次的离线进程,它将查询您的“操作日志数据库”并将其插入到关系数据库。
D. 如果您的系统可能会丢失一些操作日志记录,请考虑使用生产者/消费者模式(例如 - 在生产者和消费者线程之间使用队列) - 需要记录操作的线程不会同步记录它们,但会记录他们异步。
E.另外,不要忘记这样的日志表有可能在时间上被过度淹没,导致对其的查询需要很长时间。
对于这些问题,请考虑以下因素:
E.1。每天删除真正旧的日志 - 比方说 - 超过一个月的日志,或者将它们移动到某个“备份”表。
E.2 索引一些您主要用于操作日志查询的字段(例如 - 可能是一个 action_type)字段。
关于java - 是否有任何启发式/模式来记录用户操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12770142/