Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用undo-redo设计SQL数据库?_Mysql_Sql_Undo Redo_Delta_Audit Tables - Fatal编程技术网

Mysql 如何使用undo-redo设计SQL数据库?

Mysql 如何使用undo-redo设计SQL数据库?,mysql,sql,undo-redo,delta,audit-tables,Mysql,Sql,Undo Redo,Delta,Audit Tables,我正试图找出如何设计我的DB表以允许撤消重做 假设您有一个具有以下结构的任务表: id <int> title <varchar> memo <string> date_added <datetime> date_due <datetime> id 标题 备忘录 添加日期 到期日 现在假设经过几天的多次登录,已经进行了多次编辑;但用户希望返回其中一个版本 您是否会有一个单独的表来跟踪更改?或者-您是否会尝试将更改保留在任务表中(“g

我正试图找出如何设计我的DB表以允许撤消重做

假设您有一个具有以下结构的任务表:

id <int>
title <varchar>
memo <string>
date_added <datetime>
date_due <datetime>
id
标题
备忘录
添加日期
到期日
现在假设经过几天的多次登录,已经进行了多次编辑;但用户希望返回其中一个版本

  • 您是否会有一个单独的表来跟踪更改?或者-您是否会尝试将更改保留在任务表中(“ghost”行,因为没有更好的术语)
  • 您是跟踪所有列还是只跟踪每次更改的列 如果重要的话,我正在使用MySQL。此外,如果有必要,我希望能够显示历史(ala Photoshop),并允许用户切换到任何版本

    附加问题:您是在更改时保存整个
    备忘
    单元格,还是只保存增量?我之所以问这个问题,是因为
    memo
    单元格可能很大,而且每次修订只会更改一个单词或字符。诚然,保存增量需要解析,但是如果不经常需要撤消,那么节省空间而不是处理时间不是更好吗


    谢谢您的帮助。

    当我使用SQL执行类似类型的操作时,我总是使用第二个表作为修订历史记录。这可以防止主表在版本中变得过大。其基本原理是,检索当前记录几乎100%的时间都在进行,查看历史记录并回滚(撤消)的情况非常少见

    若您只有一个撤消或历史记录,那个么在表中进行跟踪可能就可以了


    要保存增量还是保存整个单元格取决于预期的增长/使用情况。如果您愿意创建管理增量的逻辑,那么这将节省您的空间。如果事情没有真正创建新版本,我通常不会从这开始,(应用YAGNI)

    您可能希望以增量形式压缩修订,但您仍然应该拥有完整的当前修订,以便快速检索

    然而,旧的增量到新的增量需要大量的处理,除非您有一些非增量作为基础。较新到较旧的增量每次发生变化时都需要重新处理。因此,三角洲通常不会给您带来很多好处,但会带来更大的复杂性

    上一次检查是几年前,Wikipedia背后的软件存储了全文,并提供了一些方法来使用gzip压缩旧版本以节省空间,并为删除的版本/页面提供了一个专用的表
    存档


    他们的网站有一个你可能会发现有用的历史记录表。

    我会为你的任务表创建一个历史记录表。与任务相同的结构+名为previousId的新字段。这将保留以前的更改id,因此您可以在不同的更改(撤消/重做)中来回切换

    为什么要用新的历史表格?原因很简单:不要在tasks表中装入它不是为之设计的内容

    至于空间,在历史记录中,使用二进制格式并压缩要存储的文本内容,而不是备忘录。不要试图检测变化。您将遇到错误代码,这将导致沮丧和浪费时间

    优化: 更好的是,您可以在历史记录表中只保留三列: 1.taskId(任务的外键) 2.数据-一个二进制字段。在保存历史记录表之前,请创建一个XML字符串,其中仅包含已更改的字段。 3.previousId(将帮助维护更改队列并允许来回导航)

    对于数据字段,创建如下XML字符串:

    <task>
      <title>Title was changed</title>
      <date_added>2011-03-26 01:29:22<date_added>
    </task>
    
    
    标题已更改
    2011-03-26 01:29:22
    
    这将基本上告诉您,这次您只更改了标题和添加的日期字段

    构建XML字符串后,如果需要,只需压缩它并将其存储到历史表的数据字段中

    XML还将允许灵活性。如果在tasks表中添加/删除字段,则也不需要更新History表。这样一来,tasks表和History表的结构就解耦了,所以您不需要每次更新两个表

    PS:别忘了添加一些索引以快速浏览历史记录表。要编制索引的字段:taskId和previousId,因为您需要对该表进行快速查询


    希望这有帮助。

    这里有类似的问题。顺便看一看,压缩会将文本大小减少到原始文本的5%。一个普通值大约是10%,但是如果你有普通的、重复的单词,你会得到更好的压缩。这很聪明,但我不确定我是否理解“3个字段”的概念。当然,历史记录表中的每个记录都必须有自己的ID字段(自动递增)、任务记录ID的外部链接以及对以前历史记录ID的引用(如果适用)(即具有相同的任务记录ID)。。。还是有我不明白的sthg?@MikCorvent我想你知道了,我们需要两个键:一个到任务表(taskId)和一个到历史表(previousId)加上有效负载(数据)更改后,您可以基于taskId和previousId字段浏览历史记录,还可以访问更改的数据,并在需要时进行恢复。