不需要记录整个JSON,只需记录已更改的值,也不必记录插入数据,因为您的数据库将始终具有当前记录,并且记录插入数据是多余的。
Diff
函数将现有JSON中的差异与更改后的JSON进行比较。
为了演示一个示例,请参阅下面借用JavaScript的代码
差异
来自此的函数
Answer
// 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
这可能满足你的需要。
只要保留时间戳或序列号,就可以链接多个事务以回滚到任何先前状态。这类似于执行增量备份。
最后,您可以进行完全备份并清除以前的事务,类似于完全备份。