代码之家  ›  专栏  ›  技术社区  ›  Layke

修订更改-以视觉方式显示更改

  •  1
  • Layke  · 技术社区  · 14 年前

    项目的回滚


    我删除了很多这个问题的主体,因为我意识到我应该重新措辞它。 这里是重新措辞:

    我如何实现具有突破性的功能?将一个版本更新与上一个版本进行比较。我本身不想修改或版本控制,因为我可以在我的MySQL数据库中处理它,但我希望能够 视觉上 在一个几乎像changelog的页面(如果用户希望看到的话)上,通过更新来识别绿色和红色删除的更改。

    我在修订版上看到了类似的东西,所以,想有这样的东西吗?

    我想我现在的问题和原来的有根本不同,对不起

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

    6 回复  |  直到 12 年前
        1
  •  2
  •   Jon Skeet    14 年前

    您的建议对我来说完全合理:每个修订版一个表,每个“可显示文章”一个表,有效链接到修订版表中的当前修订版。有什么详细的吗?

    能够 在一张表中用某种“当前”列来伪造它,但是您必须确保对于任何特定的文章只有一个最新的修订版本,这对我来说是相当讨厌的。

        2
  •  3
  •   Community Jaime Torres    7 年前

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

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

    2. 一张桌子对两张桌子:
      Third_normal_form 建议使用两个表:
      - Article[ActicleID(int,PK), AuthorID(int,FK), ...]
      - ArticleRevisions[ArticleID(int,UK), RevisionID(int,UK), Content, RevisionComment, RevisionTimeStamp, ...]
      在任何情况下,储存完整的物品,不要玩 delta -类型实现——您的用例并不要求复杂性,而是简单性。此外,您还可以冗余地存储 LatestRevisionID Article 表以便于检索最新版本。
      您可以选择使用一个表的解决方案。例如,请看第76行( Table('wiki'... )在的数据库架构中 Trac . 你也可以看看 Trac 是不是因为它的简单维基 revision history revision diff ,这与StackOverflow上的非常相似。

    第2部分:检测和呈现两次修订之间的差异 :
    首先,一个人没有 视觉上 标识更改,但 以编程方式 . 您需要的是一个提供两个文件(字符串/字符串列表)的库,它将为您提供一个diff结果。在许多情况下,一个选项用于逐行比较,例如 did stackoverflow )然后你需要一种方法来展示这些结果(用绿色、红色、删除线等)。

    虽然我对PHP及其库知之甚少,但下面的链接可以帮助您开始:

        3
  •  1
  •   Rahul Prasad    14 年前

    尝试将其存储为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属性比较行。

        4
  •  0
  •   Jerry Coffin    14 年前

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

        5
  •  0
  •   Pekka    14 年前

    如果我正确理解了您的标记,那么您正在寻找 diff 在PHP中。对的?您如何将其存储在数据库中取决于我们目前无法真正看到的因素-我们不知道您打算如何处理多种语言等。不管怎样,剩下的就是每个版本都是一个MySQL text 以某种方式,在记录中。然后,您将使用 微分 .

    下面是一些有趣的PHP实现。我没有和他们合作过,所以我不能告诉你他们有多好,是否符合你的要求,但他们至少是一个起点:

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

        6
  •  0
  •   JST    14 年前

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