1

文章回滚


我已经删除了这个问题的很多正文,因为我意识到我应该改写它。这里是改写:

我怎样才能实现带有删除线的东西?将一个修订更新与前一个进行比较。我本身不想要修订或版本控制,因为我可以在我的 mySQL 数据库中处理它,但我希望能够通过几乎类似更改日志的页面上的更新来直观地识别带有绿色和红色删除线的更改(如果用户想看看)。

我在 SO 的修订更改中看到了类似的内容,并且想要这样的东西吗?

我认为我现在的问题与原来的问题根本不同,对不起

但在这里:https ://stackoverflow.com/posts/2326658/revisions

4

6 回答 6

3

第 1 部分:数据结构 (来自原始问题)

  1. 每个版本一行 -VS- 一行中的所有版本:
    每行存储一个修订版,不要将所有修订版作为 XML 或任何其他多值支持类型打包到一行中。最初,文章可能会被编辑几次,并且作者会要求进行修订,但稍后您的应用程序只会要求最新版本。在这种情况下,加载所有更改历史记录毫无意义。

  2. 一个表 -VS- 两个表:
    Third_normal_form建议使用 2 个表:
    - Article[ActicleID(int,PK), AuthorID(int,FK), ...]
    - ArticleRevisions[ArticleID(int,UK), RevisionID(int,UK), Content, RevisionComment, RevisionTimeStamp, ...]
    无论如何存储完整的文章并且不要使用delta-type 实现 - 您的用例不需要复杂性,而是为了简单。LatestRevisionID此外,您可能会在表中冗余存储,Article以便更轻松地检索最新版本。
    您可能会选择一张桌子的解决方案。例如,查看TracTable('wiki'...的数据库模式中的第 76()行。您还可以通过查看其修订历史修订差异的示例来了解Trac如何为其简单的 Wiki 执行此操作,这些示例与StackOverflow 上的非常相似。

第 2 部分:检测和呈现两个修订版本之间的差异
首先,一个不直观地识别更改,而是以编程方式识别更改。您需要的是一个库,它给定两个文件(字符串/字符串列表)将为您提供差异结果。在许多情况下,人们会选择逐行比较,就像stackoverflow一样)。然后,您需要一种将这些结果呈现给用户的方法(绿色、红色、三振出局等)。

尽管我对 PHP 及其库知之甚少,但以下链接应该可以帮助您入门:

于 2010-03-09T23:19:04.453 回答
2

您的建议对我来说听起来完全明智:一个表格,每个修订一行,一个表格,每个“可显示文章”一行,有效链接到修订表中的当前修订。这有什么好说的?

可以在单个表中使用某种“当前”列来伪造它,但是您必须确保对于任何特定文章只有一个修订是最新的,这对我来说听起来很讨厌。

于 2010-02-24T14:30:50.760 回答
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 属性比较行。

于 2010-03-09T18:28:21.793 回答
0

您的问题可以概括为“版本控制是如何实现的?” 通常情况下,每个修订都存储为与旧版本的差异,而不是重新存储整个文本(尽管有很多变化)。大多数系统可以/将存储所有非文本格式的完整版本,它们无法将更改隔离为“行”。

于 2010-02-24T14:31:43.847 回答
0

如果我正确理解了您的标签,那么您正在寻找diffPHP 中的实现。正确的?您如何将其存储在数据库中取决于我们现在无法真正看到的因素 - 我们不知道您打算如何使用多种语言等。无论如何,剩下的就是每个版本都会以text某种方式成为一个 mysql 字段,在一个记录中。然后,您将使用diff.

这里有一些看起来很有趣的 PHP 实现。我没有与其中任何一个合作过,所以我不能告诉你它们有多好以及它们是否符合你的要求,但它们至少可能是一个起点:

例如,根据您的服务器配置,您还可以使用 Linux 命令行diff

于 2010-03-09T18:34:22.807 回答
0

我不知道您是在处理代码差异还是更一般的文档。几年前我做了一个实现,显示 wiki 文档版本的差异,两个版本并排,旧版本的删除标记为红色,新版本的添加标记为绿色。所有这些都是在 javascript 中完成的,首先只提取 HTML 的文本部分,对它们进行比较(使用diff_match_patch.js),然后使用 diff 结果确定要突出显示的内容(使用样式更改背景颜色)。它非常棘手,并不完美(但足够接近)并且涉及到相当多的 DOM 操作。所以,可行,但并不容易。

于 2010-03-10T01:08:01.880 回答