gpt4 book ai didi

php - 捕获实体状态交易

转载 作者:行者123 更新时间:2023-11-29 03:20:58 24 4
gpt4 key购买 nike

我有一个与运行 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这可能会满足您的需求。

只要您保留时间戳或序列号,您就可以链接多个事务以回滚到任何先前状态。这类似于进行增量备份。

如果您想创建检查点并将当前状态与之前的状态进行比较,您还可以按设定的时间间隔运行维护任务。也许每月一次备份并记录已更改的对象之间的差异。这类似于差异备份。

最后,您可以进行完整备份并清除之前的交易,类似于完整备份。

管理员通常会结合使用增量备份、差异备份和完整备份来平衡存储成本和恢复需求。使用上面概述的这些方法,您可以实现适合您的策略。

关于php - 捕获实体状态交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45205298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com