数据协作
像是 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 过的记录应该都删除,或是程序批量移动到一个不可见的分支上,也许未来可以从垃圾桶里找回