如何为用户发布的内容创建版本控制/历史/修订系统?

时间:2013-03-14 17:36:39

标签: php mysql version-control compare database-versioning

在阅读了很多关于Keeping page changes historyHow to version control a record in a database的SO问题之后(例如),我无法找到真正优雅的解决方案来完成这项工作。

现在,让我们尽可能清楚地解释我们需要什么,对于这个简单的修订系统,允许注册用户发布一些文章,其他用户提交这些文章的修订版,然后一些主持人用户检查这些修订。

MySQL数据库

数据库包含一个文章表,其中包含以下简化字段:

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时,不能提交其他REVISION
  • 有没有办法录制轻型版本?顺便说一下,是否可以在REVISION表中插入只通过SQL,PHP或js比较函数更新的内容?如何像SO一样显示它呢?因为我担心{{1}}表会非常沉重。

  • 奖金:SO ??

任何想法,链接,源代码,插件(MySQL,PHP 5和JS / Jquery)都会受到极大关注。

1 个答案:

答案 0 :(得分:8)

由于您的个性化工作流程,我没有看到针对您的问题的插件的单一答案。

关于修订工作流程

这是你自己对它的看法,对你的使用来说似乎并不太糟糕。但我确信一些用例应该顺便发展。

我可以看到的第一点是,您必须锁定修订版,直到修订版正在进行中,直到主持人验证它为止。例如,在正在进行时添加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(或类似)来修改版本之间的hilight变化。

要了解有关SO技术的更多信息,您可以查看this page