跳到主要内容

数据协作

像是 git 分支管理一样

我们可以定义 main 主分支记录最新数据,把不稳定的数据记录在新分支

数据分支支持合并,你可以在本地更改很多次,集中 push,集中 pull, merge 等操作

分支管理

系统表 RxDBChange 会通过数据库触发器(Trigger) 记录所有数据库的数据变化(插入,修改,删除),RxDBBranch 表会记录当前分支,这样我们就可以通过历史记录来计算出任何时刻的数据,再去修改其他表的数据达到切换版本的需求

分支切换

从 dev 分支切换到 main 分支的执行的 SQL 事务

BEGIN;
PRAGMA triggers = OFF; // 关闭触发器
// 执行当前 `dev` 记录开始,执行 `inversePatch` 变化,直到 `main`, `dev` 共同的节点
// 执行当前 `main` 分支的节点到最新记录的所有 `patch`
// 切换新分支 `main` 分支
// 执行替换 table 所有触发器,让触发器默认写分支为 `main`
PRAGMA triggers = ON; // 启用触发器
COMMIT;

分支合并

你可以随时/实时 pull,push 如果遇到数据冲突需要像 git 一样合并冲突

直接合并

  • 把当前分支改成目标分支
  • 父分支改成最新的,那么当前分支跟目标分支就是一样了

压缩合并

  • 找到共同父节点,计算从父节点到当前分支最新的节点的所有数据变更
  • 生成跟 git 差不多的 pull request 请求
  • 按照一定规则计算变更冲突
  • 通过本地编辑修复冲突
  • 合并生成目标分支的所有 patch 操作

分支删除

  • 删除就是清理本地记录
  • 直接合并的分支,删除标记即可
  • 压缩合并的分支,删除 change 里的所有记录

undo/redo

  • 整个库就是把当前分支的数据一步步执行 inversePatch 或是 Patch,但是得有个指针记录
  • 一但触发新记录 inversePatch 过的记录应该都删除,或是程序批量移动到一个不可见的分支上,也许未来可以从垃圾桶里找回

实时同步