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



所以我用关系数据库构建了一个超级简单的笔记应用程序(如果你好奇,我用Excel VBA + MySQL)。作为印象笔记的替代品,这款应用对我来说非常棒,但我有其他的功能想法:我可以为每个单独的笔记实现版本控制/历史记录吗?

要清楚,我不是在谈论数据库记录或模式的版本控制。我正在努力做一个面向用户(而不是开发者)的界面,以便"及时"记笔记。所以,是的,这可以通过简单地为每个音符"线程"分配一个唯一的ID来完成,在某种意义上,线程包含该音符的运行历史,但如果可能的话,我也希望尽可能地压缩这些数据,只存储变化的差异。

例如,如果我有一个正文的注释:

"这是笔记主体。它是超级长文本"然后改成:

"这是笔记主体。这是一个非常长文本">

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

这可能与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如何在后续版本中被重用。它还允许在不同的音符中重用一个section。

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

[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,否则只存储完整的音符
  • 将笔记分割成块/部分,并将块历史记录保存为diffs

点击这里获取以下引用来源的链接…

"本地版本控制系统:这是最简单的形式之一,它有一个数据库,在版本控制下保存所有对文件的更改。RCS是最常用的VCS工具之一。它将补丁集(文件之间的差异)以特殊格式保存在磁盘上。通过将所有的补丁加起来,它可以重新创建任何文件在任何时间点的样子。">

您将无法仅仅存储更改并有效地将它们添加回来以重新创建以前的版本。

原始文件:1、2、3、4、5、6、7、7

文件条目#21、2、3、4、5、6、6、7

store 7 == 6;##this doesn ' t tell which 7 to replace

存储源自。Str [6] == 6;##这需要解析,例如:保存整个原始文件

现在. .假设我们一开始就保存了原始文件一次…这个概念的第一次迭代是可行的……它指向原始保存并存储对原始保存的更改。当你拉下文件版本以进行更改并创建版本#3时,你最终会拉出原始文件,然后拉出(第一,第二,……)第400次,第n次)更改,以便获得文件的第n个版本……假设您对文件进行了n次更改,您最终将不得不拉出原始文件,然后按顺序拉出每个单独的更改,因此您可以构造第n个文件版本

你最终将能够推动小的变化,并对它们进行排序,但你不仅要解析文件,以创建一个棘手的方式来定义这些变化。真正的问题是如何拉动它……拉得慢就拉得慢,拉得多就得拉。本地的…Aspect是做到这一点的必要条件。但是,这是可行的。只需搜索本地版本控制系统

最新更新