在阅读了很多关于Keeping page changes historyHow to version control a record in a database的SO问题之后(例如),我找不到真正优雅的解决方案来完成这项工作。
现在,让我们尝试尽可能清晰地解释这个简单的修订系统的需求,该系统允许注册用户发布一些文章,其他用户提交这些文章的修订,然后由一些主持人用户检查这些修订。
MySQL数据库
该数据库包含一个具有以下简化字段的articles表:

ARTICLE(id, id_user, title, content, date);
为了实现修订/历史版本,我猜我们将有下表:
REVISION(id, id_article, revision_id_user, id_moderator, revision_date,
         revision_title, revision_content, revision_description, revision_check);
与关系:ARTICLE 0,n <---> 1,1 REVISION 工作流程
  • 用户创建一个ARTICLE,将其插入ARTICLE表中(太棒了!)
  • 另一个用户对此ARTICLE进行更新,此更新记录在REVISION表中,并排队给主持人用户。 (revision_check=0)。
  • 主持人用户验证REVISION(revision_check=1),然后ARTICLE(content)获取REVISION(revision_content)值。

  • 我的问题
  • 这个工作流程似乎是一个好方法吗?因为,我看到一个错误:REVISION是否有几个ARTICLE:
  • 我们应采用上次提交的REVISION或原始ARTICLE的内容吗?
  • 或者,我们是否应该阻止修订,因为在未检查最后一个的情况下无法提交其他REVISION
  • 是否有记录轻度版本控制的方法?顺便说一句,是否可以通过SQL,PHP或js比较功能仅将更新的内容插入REVISION表中?以及如何像这样显示它呢?因为恐怕REVISION表会很重。
  • 红利:怎么样?

  • 任何想法,链接,源,插件(MySQL,PHP 5和JS/jQuery)将不胜感激。

    最佳答案

    由于您的个性化工作流程,我看不到带有插件的单个答案。
    关于修订工作流程
    这是您自己的看法,使用起来似乎还不错。但我确信某些用例必须顺便进行改进。
    我所看到的第一点是,您必须锁定修订,直到修订进行中并且由主持人验证为止。进行时,例如,添加ARTICLE(revision=progress)以对其进行锁定,并避免用户通过显示消息来同时编辑文章。
    第二点,请注意,我相信本文的作者可以在不进行任何审核的情况下对其进行更新。因此,在作者更新自己的文章时,您还必须设置ARTICLE(revision=progress)
    关于在db中记录修订的简易版本
    您可以在php(或其他)中创建一个疯狂的函数,该函数会为每次更改创建一个数组,如下所示:

    array('1'=>array('char_pos'=>'250','type'=>'delete','length'=>'25','change'=>''),
    '2'=>array('char_pos'=>'450','type'=>'insert','length'=>'16','change'=>'some text change'),
    ...);
    
    如您所见,在数据库中创建,格式化和记录该信息非常繁琐且难以管理。
    我认为没有办法使用MySQL进行版本控制。您可以使用PROPEL之类的ORM进行版本控制,但是我认为结果不会达到您的期望...
    在这里,更好的方法似乎是记录每个修订的整个更新文章,即使它增加了数据库的数量也是如此。在您的工作流程中,您不会阅读太多REVISION表,因此MySQL不会为此负担很重。
    关于比较显示
    您可以使用Diff-Match-Patch plugin突出显示两个内容"differences" demo here之间的更新。我认为SO使用Beyond compare(或类似方法)来突出各版本之间的变化。
    要了解有关SO技术的更多信息,请查看this page

    10-08 06:31