记录应用程序中的用户活动

时间:2014-02-04 07:54:45

标签: php mysql database web-applications

我在这里谈论的问题(当然要问)并不新鲜。我搜索了网络和堆栈溢出,我对这个问题的许多部分(优点和缺点)有了想法,但仍然有一部分遗漏在我脑海中。所以我认为在一个地方分享是一个好主意(当然,这将与其他人的想法更完整)并要求它。

问题很明显:“我们想记录用户的每一个动作” - 可能是当我们解决大问题时,较小的问题(比如只记录一个动作就是小菜一碟)。

首先,我通过网络和堆栈溢出阅读:

使用数据库而不是文件:虽然这总是取决于具体情况,但这是一个很好的建议。但是由于DB的许多好处,从长远来看,这是更好的解决方案。

数据库层或应用层:实际上取决于此。例如,如果你想要真正监控一切(我的意思是数据库中每一行都有变化,似乎我们将有一个选择“使用数据库触发器”。虽然有很多关于MySQL的讨论说,触发减速数据库,他们建议不要使用它。因此,这取决于您需要的详细程度,您可以将您的日志系统置于数据库层应用层(对于检查一些常用函数调用$ logClass-> logThis())。

使用观察者:清洁代码总是更好。如果您熟悉观察者,则可以在发生操作时使用它们为您执行操作,因此每次CRUD发生时都不必添加 $ logClass-> logThis()你的申请。

要记录的内容:简单明了的答案是:根据您的需求,但您需要一些常用字段:

  • user_id(如果有唯一的用户ID
  • 时间戳( unix可能
  • ip(不是每个人都知道如何在第一时间伪造它所以使用它,甚至假装它会让你对用户行为有所了解
  • action_id(应该是预定义的操作,以便更好地统一查询和报告
  • object_id(上进行更改的记录的唯一行ID)
  • 行动( 我的问题是关于此部分
  • 等......

如果我在任何部分犯了错误或在本帖中添加其他有用信息,如果有人纠正我,我将不胜感激,因此它将成为其他用户的良好参考之一。

现在我的问题是:如何存储操作?。为了更好地理解,请考虑以下方案。

我有一个名为“product”的表和一个名为“companies”的表。从我们想要将产品分配给公司的业务逻辑,我们最终在表“company_product”中。现在,当用户插入新产品并同时分配它的公司时,2表将受到影响(删除和更新也是如此):“product”和“company_product”,我们想知道:

  • 插入了什么?
  • 什么被删除?
  • 什么更新到了什么?

对于性能问题而且因为我对触发器知之甚少,我想在应用层中使用日志,所以我最终得到了这个想法,我可以保存数据库的操作字段数组 json 结构中。但是当我开发我的解决方案时,我遇到了一个问题:如何让非技术用户理解这个日志?因为例如我想在删除(插入)产品时在数据库的操作字段中保存这样的东西身份证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 个答案:

答案 0 :(得分:0)

您实际上是要收集分析类型的详细信息。 如果你选择平台而不是去关系表,这将是一件好事。

因为如果你想进行更多的分析,你的关系表将不是一个好的选择,因为它缺乏性能。