我在这里谈论的问题(当然要问)并不新鲜。我搜索了网络和堆栈溢出,我对这个问题的许多部分(优点和缺点)有了想法,但仍然有一部分遗漏在我脑海中。所以我认为在一个地方分享是一个好主意(当然,这将与其他人的想法更完整)并要求它。
问题很明显:“我们想记录用户的每一个动作” - 可能是当我们解决大问题时,较小的问题(比如只记录一个动作就是小菜一碟)。
首先,我通过网络和堆栈溢出阅读:
使用数据库而不是文件:虽然这总是取决于具体情况,但这是一个很好的建议。但是由于DB的许多好处,从长远来看,这是更好的解决方案。
数据库层或应用层:实际上取决于此。例如,如果你想要真正监控一切(我的意思是数据库中每一行都有变化,似乎我们将有一个选择“使用数据库触发器”。虽然有很多关于MySQL的讨论说,触发减速数据库,他们建议不要使用它。因此,这取决于您需要的详细程度,您可以将您的日志系统置于数据库层或应用层(对于检查一些常用函数调用$ logClass-> logThis())。
使用观察者:清洁代码总是更好。如果您熟悉观察者,则可以在发生操作时使用它们为您执行操作,因此每次CRUD发生时都不必添加 $ logClass-> logThis()你的申请。
要记录的内容:简单明了的答案是:根据您的需求,但您需要一些常用字段:
如果我在任何部分犯了错误或在本帖中添加其他有用信息,如果有人纠正我,我将不胜感激,因此它将成为其他用户的良好参考之一。
现在我的问题是:如何存储操作?。为了更好地理解,请考虑以下方案。
我有一个名为“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字段中以进行进一步诊断,但它需要额外的工作和更多的查询来运行并不总是需要考虑的事情(日志)
我将非常感谢有关本文的任何其他信息(我确信还有其他可以讨论的标准),并回答我的问题。
答案 0 :(得分:0)
您实际上是要收集分析类型的详细信息。 如果你选择平台而不是去关系表,这将是一件好事。
因为如果你想进行更多的分析,你的关系表将不是一个好的选择,因为它缺乏性能。