【发布时间】:2014-02-28 02:07:41
【问题描述】:
我在这里要讨论和(当然要问)的问题并不新鲜。我搜索了网络和堆栈溢出,我对这个问题的许多部分(优点和缺点)有了一些想法,但我的脑海中仍然缺少一些部分。所以我觉得在一个地方分享会是一个不错的主意(当然它会更完整地与其他人的想法)并请求它。
问题很明确:“我们想要记录用户的每一个动作” - 可能当我们解决大问题时,小问题(比如只记录一个动作将是小菜一碟)。
首先来自我通过网络阅读的内容和堆栈溢出:
使用 DB 而不是 File: 这是一个很好的建议,尽管它始终取决于具体情况。但由于 DB 的诸多好处,从长远来看,总体而言,它是更好的解决方案。
DB 层或应用层:实际上取决于。例如,如果您想真正监控一切(我的意思是数据库中发生变化的每一行,似乎我们将只有一个选择“使用数据库触发器”。尽管围绕 MySQL 进行了很多讨论,但它说,触发减速数据库,他们建议不要使用它。所以这取决于您需要的详细信息级别,您可以将日志系统放在DB层或应用层(对于检查一些常见的函数调用 $logClass->logThis())。
使用观察者:简洁的代码总是更好。如果您熟悉观察者,则可以在发生操作时使用它们为您做事,这样您就不必在每次发生 CRUD 时都添加 $logClass->logThis()应用。
要记录什么:简单而简短的回答是:根据您的需要,但您需要一些常见字段:
- user_id(如果唯一的用户 ID 可用)
- 时间戳(unix 可能)
- ip(不是每个人都知道如何首先伪造它,所以使用它,即使伪造它也能让你对用户行为有所了解)
- action_id(应该是预定义的操作,以便更好地统一查询和报告)
- object_id(更改过的记录的唯一行 ID)
- 动作(我的问题是关于这部分的)
- 等等……
如果我在任何部分出现错误或在此帖子中添加其他有用信息,如果有人纠正我,我将不胜感激,因此它将成为其他用户的良好参考之一。
现在我的问题是:如何存储操作?。为了更好地理解,请考虑以下场景。
我有一个名为“product”的表和一个名为“companies”的表。从业务逻辑中,我们想要将产品分配给公司,我们最终在表“company_product”中。现在,当用户插入新产品并同时为其分配公司时,将影响 2 个表(删除和更新也是如此):“product”和“company_product”,我们想知道:
- 插入了什么?
- 删除了什么?
- 更新了什么?
由于性能问题以及我对触发器的了解不够,我想在应用层使用日志记录,所以我最终有了这个想法,我可以保存数据库的操作字段在 array 或 json 结构中。但是当我开发我的解决方案时,我遇到了一个问题:如何让非技术用户理解这个日志?因为例如我想在删除(插入)产品时在数据库的操作字段中保存这样的内容id 为 20:
action : [{id: 20, product_id:2, company_id: 1},{id: 21, product_id:2, company_id: 2}]
这并不是每个人都容易阅读和理解的东西。实际上,我可以使用这个 json 更具可读性,并使其如下所示:
action : {'Product A Deleted From Company X', 'Product A Deleted From Company Y'}
并将之前的操作保存在 Technical_action 字段中以供进一步诊断,但它需要额外的工作和更多的查询来运行某些并不总是需要考虑的事情(日志)
如果能提供有关本文的任何其他信息(我确信还有其他可以讨论的标准),我将不胜感激,并回答我的问题。
【问题讨论】:
-
请在帖子的-1上发表评论,以便我知道帖子或内容有什么问题。谢谢:)
-
我想知道这个主题对每个人来说都那么明显,还是我们不考虑登录我们的项目?? 2 天,没有社区参与!
标签: php mysql database web-applications