删除
删除以实体为单位,只移除选中实体的全部版本,删除后不可复活
背景
Orisumi 保留每个版本用于追溯,用户也要能删除自己的数据。需要划清删除移除什么、留下什么,以及被删的内容还被引用时怎么办。
离线的 SDK 会在联网后补发旧版本。删除后如果还能重新保存,这些请求会把删掉的数据重新建出来。
决定
- 删除以实体为单位,移除这个实体全部版本的内容。
- 删除只作用于选中的实体。引用被删除版本的其他版本保留引用,读取时报告目标不可读取。
- 删除的实体不再接受新版本,重放旧版本也不能恢复它。EntityId 和 VersionId 不再分配。
- 被删除的内容不留副本。
- 仍有业务版本使用某个 EntitySchema 时,不能删除这个 EntitySchema。
理由
“版本不可改写”和“用户可以删除”两条要求可以同时满足:前者禁止替换内容,后者让内容不可读。用户删除数据的权利优先于追溯。
只删除一个版本,还要决定版本链断开后当前版本是谁,目前没有这样的需求。
删除后不可复活,离线补发才撤销不了删除。
其他实体中的推断、摘要或引文会保留下来,用户要删除它们时逐个选择。
Schema 还有数据依赖时不能删除,保留的数据才能按原定义解释。
放弃的方案:
- 删除后允许以同一个身份重建。 离线补发的旧请求会撤销删除。
- 软删除,保留内容并标记删除。 删除的数据仍然留在系统中。
- 删除时沿引用连带删除。 会删掉用户没有选择的数据。
- 为追溯在别处保留副本。 违背用户的删除。
代价
- 输入被删除后,依赖它的观测无法完整追溯。
- 删除一种类型的全部数据需要两步。
- 被删除的身份永久不能再用。墓碑的保存、查询和空间回收由存储设计决定。