捕获实体状态事务
我有一个应用程序,它与运行php和mysql的API进行通信。 我想要做的是为每个用户记录我的表中实体发生的变化。如果用户对其数据进行更改,则可以看到发生的更改。通过这种方式,如果他们有任何问题或意外删除了某些东西,我可以回过头去告诉他们在一年的不同阶段,这些实体是什么样子的。捕获实体状态事务
我不需要疯狂地具体说明差异,我想要做的就是记录插入或更新(因为它在JSON体中表示)。
基本上我现在所做的是任何时候对我的API的某些路由发生POST/PUT,我只是将JSON放在请求体中,然后将它作为事务保存到数据库中该用户的地方。
这很棒,但是在成千上万的记录之后,JSON体很大,占用了很多空间。我的数据库表是13GB。查询需要一段时间才能运行。我截断了它,但在4个月内它又增长到另一个10GB。这个问题可能只会变大。
有人可以推荐记录这种方法吗?我是否可以将请求正文发送到AWS或其他某个存储上的某个存储,或者在其他地方的其他数据库上?可能是平面文件还是非关系数据库?这并不是说我实际上需要实时的数据,但如果我想要了解某人的历史,我想知道我可以。
我确实需要每晚备份数据库,因此另一种方法是我正在考虑彻底删除事务日志,而是让它每晚继续备份。当然,我将无法显示更新/添加日期的历史记录,但至少我可以始终参考几个备份,以查看在执行还原后某个给定用户在特定日期的记录。
任何想法或建议吗?谢谢!
除了记录整个JSON,您可以记录已更改的值,也不必记录插入数据,因为数据库将始终具有当前记录,并且记录插入数据是多余的。
您可以实现Diff
函数来比较现有JSON中的差异与更改后的JSON。
为了说明一个例子,请参阅以下代码,该代码从此Answer中借用了一个JavaScript Diff
函数。
// 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 ,这些软件包可能会满足您的需求。
只要您保留一个时间戳或序列号,您就可以链接多个事务以回滚到任何之前的状态。这与进行增量备份类似。
如果您想要创建检查点并将当前状态与先前状态进行比较,您也可以按设定的时间间隔运行维护任务。也许每月一次备份并记录已经改变的对象之间的差异。这将类似于差异备份。
最后,您可以完整备份并清除以前的交易,类似于完整的备份。
管理员通常会执行增量备份,差异备份和完整备份的组合来平衡存储成本和恢复需求。使用这些方法概述上面,您可以实施适合您的策略。
感谢您花时间阅读我的文章。 90%的请求实际上是POSTS(新实体),抱歉,我没有提到这一点。在这样的情况下,你会有其他的想法吗?谢谢亚历克斯 – NullHypothesis
是的,绝对不需要审核插页。这是多余的。您的数据库已经拥有新记录的属性,您不需要在日志中复制副本。 –