我删除了很多这个问题的主体,因为我意识到我应该改写它。 这里改为:
如何实施具有删除功能的内容?将一个修订更新与之前的修订进行比较。我本身不需要修改或版本控制,因为我可以在我的mySQL数据库中处理它,但我希望能够直观地通过几乎更新来识别绿色和红色的更改像页面一样更改日志(如果用户希望看到它)。
我在SO上的版本更改中看到了类似的内容,并希望有类似的内容吗?
我认为我现在的问题与原来的问题根本不同,对不起
答案 0 :(得分:3)
第1部分:数据结构 (来自原始问题):
每个版本一行-VS-一行中的所有版本:
每行存储一个修订版,不要将所有修订版打包成一行作为XML或任何其他多值支持类型。最初,文章可能会被编辑几次,作者会要求进行修订,但稍后只会在您的应用程序中请求最新版本。在这种情况下,加载所有更改历史记录毫无意义。
一张表-VS-两张桌子:
Third_normal_form建议使用2个表格:
- Article[ActicleID(int,PK), AuthorID(int,FK), ...]
- ArticleRevisions[ArticleID(int,UK), RevisionID(int,UK), Content, RevisionComment, RevisionTimeStamp, ...]
在任何情况下,存储完整的文章并且不使用delta
- 类型实现 - 您的用例不需要复杂性,但为了简单起见。您也可以将LatestRevisionID
冗余地存储在Article
表中,以便更方便地检索最新版本
您可以选择使用一个表的解决方案。有关示例,请查看Trac的数据库模式中的第76行(Table('wiki'...
)。您还可以通过查看Trac和revision history的示例来了解revision diff对其简单Wiki的处理方式,它们与StackOverflow上的示例非常相似。
第2部分:检测并呈现两个修订版之间的差异:
首先,一个不是直观标识更改,而是以编程方式。你需要的是一个库,它给出了两个文件(字符串/字符串列表)将为你提供一个diff结果。在许多情况下,一个选择逐行比较,如did stackoverflow)。然后你需要一个平均值来表示这些结果(绿色,红色,三振出局等)。
虽然我对PHP及其库知之甚少,但以下链接应该可以帮助您入门:
答案 1 :(得分:2)
你的建议对我来说听起来完全合理:一个表每个版本有一行,一个表每行“可显示文章”有一行,它有效地链接到修订表中的当前版本。这有什么问题?
你可以在一个表中用某种“当前”列伪造它,但是你必须确保只有一个版本是任何特定文章的最新版本,这听起来很漂亮讨厌我。
答案 2 :(得分:1)
尝试将其存储为XML
据我所知,这个问题。如果我们将每一行存储为一行,就可以解决它。 但这会很糟糕,因为行数会大幅增加。
因此将数据存储为
行<row num=1>How would you structure something like this. I want to allow my authors to create articles. However, </row>
<row num=2>should they choose, I would like to be able to allow each save to be a new revision and then allow each </row>
............
一行中的所有内容,但采用xml格式。 当您检索它时,您可以使用num属性比较行。
答案 3 :(得分:0)
您的问题可归纳为“如何实施版本控制?”通常情况下,每个修订版本都是作为旧版本的差异而不是整个文本再次存储(尽管有很多变化)。大多数系统可以/将存储完整的非文本格式的版本,他们无法将更改隔离到“行”。
答案 4 :(得分:0)
如果我正确理解了您的代码,那么您正在寻找PHP中diff
的实现。正确?如何将它存储在数据库中取决于我们现在无法真正看到的因素 - 我们不知道您计划用多种语言做什么等等。无论如何,剩下的就是每个修订版本都会以某种方式成为一个mysql text
字段。然后,您将使用diff
比较其中两个修订版。
以下是一些有趣的PHP实现。我没有和其中任何一个人合作,所以我不能告诉你他们有多好以及他们是否符合你的要求,但他们至少可能是一个起点:
您需要安装 PEAR text diff engine 以查看其产生的结果,似乎没有在线演示
基于此,PHP inline diff - tool to produce inline diffs有一些看似非常有希望的样本输出。
根据您的服务器配置,您也可以使用Linux命令行diff
。
答案 5 :(得分:0)
我无法判断您是在处理代码差异还是更一般的文档。几年前我做了一个实现,显示了维基文档版本的差异,两个版本并排,旧版本的红色标记为删除,新版本标注为绿色。所有这些都是在javascript中完成的,首先只提取HTML的文本部分,对它们进行区分(使用diff_match_patch.js),然后使用diff结果确定要突出显示的内容(使用样式更改背景颜色)。它非常棘手,不完美(但足够接近)并涉及相当多的DOM操作。所以,可行但不容易。