捕获实体状态事务

问题描述:

我有一个应用程序,它与运行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 ,这些软件包可能会满足您的需求。

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

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

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

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

+0

感谢您花时间阅读我的文章。 90%的请求实际上是POSTS(新实体),抱歉,我没有提到这一点。在这样的情况下,你会有其他的想法吗?谢谢亚历克斯 – NullHypothesis

+0

是的,绝对不需要审核插页。这是多余的。您的数据库已经拥有新记录的属性,您不需要在日志中复制副本。 –