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

标签 php mysql version-control compare database-versioning

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

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

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)值(value)。

我的问题

  • 这个工作流程似乎是一个好方法吗?因为,我看到一个错误:如果有几个 REVISION s 代表 ARTICLE :
  • 要不要取上次提交的内容REVISION或原文ARTICLE ?
  • 或者,我们是否需要像其他人一样阻止修订 REVISION可以在未检查最后一个时提交。
  • 有没有办法记录轻量级版本?顺便说一句,是否可以插入 REVISION表,只有通过 SQL、PHP 或 js 比较函数更新的内容?以及如何像 SO 那样显示它?因为我怕REVISION table 会很重。

  • 奖励:SO 怎么样?

任何想法、链接、来源、插件(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 .

关于php - 如何为用户发布的内容创建版本控制/历史/修订系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416332/

相关文章:

git - 如何让 git 接受自签名证书?

mysql - 获取mysql中两个表的所有字段

git - "pure git"有pull request的概念吗?

php - 如何去除表头<the>缝隙

php - 如何通过 iframe 调用验证第三方网站

php - 单选按钮 php mysql

php - MySQL和PHP解析错误

version-control - TFS 2010-VersionControl.config无效,无法加载

php - Laravel如何在错误填写表单字段时引发单个错误

PHP 正确的正则表达式在带有 unicode 的 PHP 5.3.3-7 中不起作用