2

我有一个带有 express 的后端 api。我已经使用winstonand实现了日志记录morgan

我的下一个要求是将用户的活动:时间戳、用户以及他获取或更改的内容记录到数据库 MySQL 中。我在网上搜索并找到了这个。但是由于还没有答案,所以我来到了这里。

我的想法:在我响应客户端之前,我可以在我的路由处理程序 中添加另一个查询,其中INSERT包含上述所有信息。但我很好奇是否有另一种方法可以完美地实现它。

4

1 回答 1

1

从以下案例中选择最适合您的系统的方法。

根据用例决定您的活动日志应该是持久的还是在内存中。让我们假设持久化并且 Db 是 mySQL。

如果您的数据已经是数据库,则没有必要再次存储所有数据,您可以只存储主要用于识别的键/ID,用于您执行 CRUD 的行。如果执行的操作在活动表中始终是固定的或序列化的 JSON,您可以将其存储为外键。例如,结构可以如下所示,其中activity_data是序列化的 JSON 值。

ID | activity_name | activity_data | start_date | end_date | 

如果在再次收集数据时遇到巨大的困难,在发送响应之前存储活动结束时,您可以考虑将活动函数应用于为 mySQL 创建的数据库抽象层或包装模块(假设)。例如 :

try {
    await query(`SELECT * FROM products`);
    //performActivity(insertion)
}catch{
    //performErrorActivity(insertion)
}

在这里,我们需要考虑在性能方面做一个小的权衡,因为我们在每一步都执行插入操作。

如果我们想一次完成所有操作,我们需要维护一个集合,该集合将所有活动的引用相加,request.activityPayload或者可能是缓存,最后执行插入。

如果您正在考虑专门为活动添加新的数据源,强烈建议使用非关系数据库来存储/转储此类数据(MongoDB 自以为是)。这是因为与关系数据库相比,它并不关注模式结构,而且与 mySQL 相比,您可以获得性能优势,特别是在活动存储的情况下。

于 2020-08-27T07:57:36.770 回答