我有一个应用程序,它与运行php和mysql的API进行通信。 我想做的是记录表中每个用户的实体发生的更改。如果用户对其数据进行更改,我可以看到发生的更改。这样,如果他们有疑问或不小心删除了某些内容,我可以回去告诉他们实体在一年中各个阶段的样子。
我不需要疯狂地具体说明差异,我只想记录插入或更新(因为它在 JSON 正文中表示(。
基本上我现在所做的是每当我的 API 发生某些路由的 POST/PUT 时,我只是在请求正文中获取 JSON,然后将其作为该用户发生的事务保存到数据库中的记录中。
这在早期很棒,但在数十万条记录之后,JSON 正文很大,占用了大量空间。我的数据库表是 13GB。查询也需要一段时间才能运行。我截断了它,但在 4 个月内它再次增长到另一个 10GB。这个问题可能只会变得更大。
有没有人可以推荐一种方法来记录这一点?我是否可以将请求正文发送到 AWS 上的某些内容或其他离线存储或其他位置的其他数据库?可能是平面文件还是非关系数据库?这并不是说我实际上需要实时数据,但如果我想获得我想知道的人的历史,我可以。
我确实每晚备份数据库,所以另一种方法是我考虑完全删除事务日志,而是让它继续每晚备份。当然,我将无法显示实体更新/添加日期的历史记录,但至少我始终可以参考一些备份,以查看在执行还原后的某个日期给定用户的记录。
有什么想法或建议吗?谢谢!
您可以只记录已更改的值,而不是记录整个 JSON,也不必记录插入数据,因为您的数据库将始终具有当前记录,并且记录插入数据是多余的。
您可以实现Diff
函数,将现有 JSON 中的差异与更改后的 JSON 进行比较。
为了说明一个示例,请参阅下面的代码,该代码借用了本答案中的 JavaScriptDiff
函数。
// get the current value from your database
var oldvalues = {
"id": 50,
"name": "Old Name",
"description": "Description",
"tasks": [{
'foo': 'bar'
}]
};
var newvalues = {
"id": 50,
"name": "New name",
"description": "Description",
"tasks": [{
'foo': 'bar'
}]
};
var isEmptyObject = function(obj) {
var name;
for (name in obj) {
return false;
}
return true;
};
var diff = function(obj1, obj2) {
var result = {};
var change;
for (var key in obj1) {
if (typeof obj2[key] == 'object' && typeof obj1[key] == 'object') {
change = diff(obj1[key], obj2[key]);
if (isEmptyObject(change) === false) {
result[key] = change;
}
}
else if (obj2[key] != obj1[key]) {
result[key] = obj2[key];
}
}
return result;
};
var update = diff(oldvalues, newvalues);
//save this to your database
$('#diff').text(JSON.stringify(update));
textarea {
width: 400px;
height: 50px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="diff"></textarea>
如您所见,仅保存唯一要保存的更改是{"name":"New name"}
,这将减少您的数据使用量。
你当然需要移植这个PHP或查看一些现有的软件包,如node-rus-diff 这可能满足您的需求。
只要您保留时间戳或序列号,您就可以链接多个事务以回滚到任何先前的状态。这类似于执行增量备份。
如果要创建检查点并将当前状态与先前状态进行比较,还可以按设定的时间间隔运行维护任务。也许每月一次备份并记录已更改的对象之间的差异。这类似于差异备份。
最后,您可以进行完整备份并清除以前的事务,类似于完整备份。
管理员通常执行增量备份、差异备份和完整备份的组合,以平衡存储成本和恢复需求。使用上面概述的这些方法,您可以实施适合您的策略。