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

How to create a versioning/history/revision system for contents published by users?

在阅读了很多关于保留页面更改历史记录或如何对数据库中的记录进行版本控制(例如)的 SO 问题后,我找不到真正优雅的解决方案来完成这项工作。

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

MySQL 数据库

数据库包含一个带有以下简化字段的文章表:

1
ARTICLE(id, id_user, title, content, date);

为了实现修订/历史版本,我想我们会有下表:

1
2
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) 值。

我的问题

  • 这个工作流程似乎是一个好方法吗?因为,我看到了一个错误:如果一个 ARTICLE 有多个 REVISION
  • 我们应该取最后提交的 REVISION 还是原始 ARTICLE 的内容?
  • 或者,我们是否需要阻止修订,因为没有其他 REVISION 可以提交,而最后一个未被检查。
  • 有没有办法记录轻量级版本?顺便问一下,是否可以在 REVISION 表中插入仅通过 SQL、PHP 或 js 比较函数更新的内容?以及如何像 SO 那样显示它?因为我怕REVISION表会很重。

  • 奖励:SO 怎么样?

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


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

关于修订工作流程

这是您对它的看法,对您的使用来说似乎还不错。但我敢肯定,一些用例应该顺便发展一下。

我可以看到的第一点,您必须锁定修订,直到修订正在进行并且直到它得到版主的验证。进行中时添加ARTICLE(revision=progress),例如锁定它,并通过显示消息避免用户同时编辑一篇文章。

第二点,小心,我相信文章的作者可以在没有任何审核过程的情况下更新它。出于这个原因,您也必须设置 ARTICLE(revision=progress),而作者会更新他自己的文章。

关于在db中记录一个轻量版本的修订

您可以在 php(或其他)中创建一个疯狂的函数,为每个更改创建一个数组,如下所示:

1
2
3
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 插件来突出显示两个内容之间的更新,此处为"差异"演示。我认为 SO 使用 Beyond compare(或类似)来突出修订之间的变化。

要了解有关 SO 技术的更多信息,您可以查看此页面。