如何在笔记数据库应用程序中实现笔记的版本历史记录?

How to implement version history for notes in a note taking database application?

所以我使用关系数据库为自己构建了一个超级简单的笔记应用程序(如果您好奇的话,我使用了 Excel VBA + MySQL)。 该应用程序作为 Evernote 的替代品对我来说非常棒,但我有另一个功能想法: 我可以为每个单独的笔记实现版本 control/history 吗?

明确地说,我不是在谈论数据库记录或模式的版本控制。我正在尝试制作一个面向用户(而非开发人员)的界面来“及时”做笔记。 所以是的,这可以很容易地通过简单地为每个笔记“线程”分配一个唯一的 ID 来完成,在某种意义上线程包含该笔记的 运行 历史,但如果可能的话我也想压缩这个数据尽可能多地存储更改内容的差异。

例如,如果我有正文的便条:

“这是笔记正文。这是一个 长文本” 我将其更改为:

“这是笔记正文。这是一篇非常长的文字”

我不想在数据库中再次存储所有这些字符字节,而是以某种方式只存储更改的内容(“超级”->“非常”)。

这可能与 GIT 的工作方式类似,只是我不需要分支功能。 有人会对如何做这类事情的算法有任何建议吗? 谢谢!

作为第一选择,我会坚持将整个笔记作为一个整体进行存储和版本化,即使只是更改了一个字母。它使它变得简单 - 不需要在写入时计算差异并在读取时重新构造注释。存储很便宜,MySQL 性能肯定能满足中小数据量的需求。

[notes]
note_id  version  text
      1        1  This is the note body. It’s a super long text
      1        2  This is the note body. It’s a very long text
      1        3  This is the note body. It’s a really a very long text

如果您真的希望有大量的用户和注释,或者只是出于教育目的,我只会考虑以下选项。

您可以将其分成块,而不是将版本控制注释作为一个整体 - 它可以是段落、部分或您可以区分的任何其他实体。

[sections]
section_id  text
         1  This is the note body.text
         2  It’s a super long text
         3  It’s a very long text
         4  It’s really a very long text

[notes]
note_id  version  position  section_id
      1        1         1           1
      1        1         2           2
      1        2         1           1
      1        2         2           3
      1        3         1           1
      1        3         2           4

此处注释及其版本参考特定位置的特定部分。查看 section_id = 1 如何在后续版本中重用。它还允许在不同的笔记中重复使用一个部分。

或者,如您所建议的,您可以尝试存储差异。例如,使用统一差异:

[notes]
note_id  version  text_or_diff
      1        1  This is the note body.
                  It’s a super long text
      1        2  @@ -1,2 +1,2 @@
                   This is the note body.
                  -It’s a super long text
                  +It’s a very long text
      1        3  @@ -1,2 +1,2 @@
                   This is the note body.
                  -It’s a very long text
                  +It’s really a very long text

这里的差异当然比注释的实际文本长,但是注释越大,效率会越高。如前所述,这是有代价的——阅读此类说明时,您需要加载所有版本记录并应用差异。

从这里您可以探索各种选项和优化:

  • 使用另一个diff format
  • 只存储较短的差异,否则只存储完整的注释
  • 将笔记拆分为 chunks/sections 并将块历史记录维护为 diffs