所以我使用关系数据库为自己构建了一个超级简单的笔记应用程序(如果你好奇,我使用了 Excel VBA + MySQL)。 这个应用程序对我来说非常适合作为 Evernote 的替代品,但我还有其他功能的想法: 我可以为每个单独的笔记实现版本控制/历史记录吗?
需要明确的是,我不是在谈论数据库记录或模式的版本控制。我正在尝试制作一个面向用户(而不是开发人员)的界面来“及时”记笔记。 所以,是的,这可以很容易地完成,只需为每个笔记“线程”分配一个唯一的 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
当然,这里的差异比注释的实际文本更长,但是对于更大的注释,它会更有效。如前所述,这是有代价的 - 阅读此类注释时,您需要加载所有版本记录并应用差异。
从这里您可以探索各种选项和优化:
单击此处获取以下引用来源的链接...
“本地版本控制系统:它是最简单的形式之一,并具有一个数据库,可将文件的所有更改保存在修订控制之下。RCS 是最常见的 VCS 工具之一。它将补丁集(文件之间的差异)保存在一个文件中。磁盘上的特殊格式。通过添加所有补丁,它可以重新创建任何文件在任何时间点的样子。”
您将无法仅存储更改并有效地将它们添加回来以重新创建以前的版本。
原始文件: 1,2,3,4,5,6,7,7
文件条目#2 1,2,3,4,5,6,6,7
存储 7 == 6; ##这并没有告诉我们要替换哪一个 7
存储 orig.str[6] == 6; ##这需要解析,即。保存整个原始文件
现在..假设我们从一开始就保存原始文件一次...这个概念的第一次迭代将起作用...它指向原始保存并存储对其的更改。当您拉动文件版本以进行更改并创建版本 #3 时,您最终会拉动原始文件,然后拉动(第一个,第二个,...第 400 个,第 n 个)更改,以便甚至获得第 n 个版本文件...假设您对文件进行了 n 次更改,您最终必须拉取原始文件,然后按顺序拉取每个单独的更改,这样您就可以构建第 n 个文件版本
您最终将能够推送微小的更改并订购它们,但您不仅需要解析文件以创建定义该更改的棘手方法..真正的问题将是拉动它。 ..拉起来会很慢,你必须拉太多。