如何将多个笔记的修订版本合并成一个单一版本?

3

如果这个问题之前已经被问过,请原谅。我相信这是一个经典问题,但是我还是要问一下,因为我找不到解决方案。

  • 我有一个用于记事应用的mongo/mongoose/node堆栈API。
  • 应用程序的用户可以在不同的设备或浏览器标签中打开它,有时会覆盖自己的笔记。

以下是一个时间线示例,描述了单个使用多种媒介遇到问题的用户:

  1. 用户在手机上打开应用程序(离线)
  2. 随后,用户在浏览器中打开应用程序并编辑特定笔记。
  3. 用户返回到手机上的应用程序并编辑同一笔记。现在,手机应用程序覆盖了#2中所做的编辑,因为手机处于“不同步”状态。

存在两个主要问题:
1. 应用程序没有启动同步。它保持不同步,除非用户手动点击刷新。
2. 合并两个笔记很困难,因为它不像最新的笔记是权威的,而是需要优雅地将两者合并在一起(类似于GitHub diff)

有没有处理此类问题的已知策略?我的初步研究指向类似于jsdiff的东西,它可以突出显示差异,但它不考虑与mongoose的同步和修订决议。

总之,我有多个笔记,需要将它们合并。它们可能会有所不同。


2
如果你还没有看过的话,可以去看一下 jsondiffpatch - FlorianDe
你是在寻找一个能够完成这个任务的库,还是想要一个自己实现的通用策略? - joaocarvalho
如果您知道一些通用的实现策略和/或库,我正在寻找它们。 - dipole_moment
为什么不使用Git? - Dave
git diff 很好,但我不确定如何将其与我的应用程序集成。有什么想法吗? - dipole_moment
你需要按照版本设置时间,并实施战略优先替换/删除/创建部分注释。 - Soleil
3个回答

2
我曾经遇到过类似的问题(同步离线事件)。以下是我们通常所做的,希望能对你有所帮助。
  1. 应用程序不会启动同步
你需要尽量缩短同步问题可能出现的时间段。
这可以通过观察navigator.online状态来触发同步来解决。 1. 当它变为false时,开始缓冲用户编辑。 2. 当它变为true时,从服务器拉取新的更改,然后推送缓冲操作。
  1. 合并两个注释...
这可能非常具有挑战性。这确实取决于数据类型以及您对同步错误的容忍程度。
我们发现最好在源头附近处理同步问题。我们在客户端处包含了同步问题,因此损坏的数据永远不会到达数据库。
同步本身的行为类似于git merge。
当离线设备拉取更新的数据时,它将尝试在发送到服务器之前合并缓冲操作之前
  • 如果检测到冲突,它将尝试自动纠正。为每个操作添加时间戳可能有助于对来自多个设备的操作进行排序。
  • 如果自动纠正失败,它将提示用户手动解决。
希望能对你有所帮助。

谢谢你的回答。你使用什么样的差异算法来解决冲突? - dipole_moment
在我们的情况下,我们没有对内容进行差异化处理(我们同步了工人报告的工作时间),因此可能不符合您的需求。当我们发现冲突时(工人报告的工作会话重叠),我们会将它们都显示给用户,然后他需要手动修复编辑它们。 - Guy Yogev

1
基本上,这个问题没有什么神奇的解决方案。这是一个非常普遍的问题,解决方案取决于业务需求,首先我建议您阅读《设计数据密集型应用》这本书,它可以解释这种类型的问题。

0

这是一个常见的问题,特别是在移动环境中。一个有趣的方法是在渐进式 Web 应用程序中使用 Service Workers。它们将保留您的网络请求,直到用户再次联机,然后在联机时处理它们。

这篇文章可以比我在这里更详细地解释这种方法:

https://developers.google.com/web/updates/2015/12/background-sync

注意:这篇文章是在2015年写的,现在相关技术已经有了很大进展。虽然iOS还不支持Service Workers,但预计在未来几年内会得到支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接