在阅读了很多关于Keeping page changes history或How 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)都会受到极大关注。
答案 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。