在阅读了很多关于Keeping page changes history或How 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
。 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。