代码之家  ›  专栏  ›  技术社区  ›  NullHypothesis

捕获实体状态事务

  •  2
  • NullHypothesis  · 技术社区  · 7 年前

    我不需要特别指出这些差异,我只想记录插入或更新(如JSON正文所示)。

    基本上,我现在所做的是,每当对某些路由的API进行POST/PUT时,我只需在请求体中获取JSON,然后将其保存到数据库中的记录中,作为该用户发生的事务。

    有没有人可以推荐一种方法来记录这一点?我是否可以将请求正文发送到AWS上的某个位置或其他脱机存储或其他数据库?平面文件或非关系数据库?这并不是说我真的需要实时数据,但如果我想知道某人的历史,我可以。

    有什么想法或建议吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Alexander Higgins    7 年前

    不需要记录整个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 这可能满足你的需要。

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

    最后,您可以进行完全备份并清除以前的事务,类似于完全备份。