MDBX SQLite 初版 Schema 规范
版本:MDBX-1-DRAFT
本文定义 MDBX 在 SQLite + 自定义加密层 路线下的第一版逻辑 schema。 这是实现指导文档,但其中与 project、attachment、历史链路相关的关键结构应视为强约束。
1. 目标
这版 schema 必须满足:
- 密码按
project组织 entry归属于project- 附件是一等结构
- 可以记录 commit 历史
- 可以记录 tombstone
- 可以做快照和恢复
- 可以支持后续 KDBX 导入导出
2. 设计原则
2.1 强制表
以下表从 v1 起必须存在:
vault_metaprojectsentriesattachmentsattachment_chunkscommitscommit_parentsdevice_headsbranchesobject_versionstombstonessnapshotskey_epochsconflicts
2.2 可后续补强表
以下表可在 MVP 后增强:
audit_eventsproject_tagsentry_custom_fieldssearch_index_cache
3. 表结构总览
3.1 vault_meta
用途:
- 存储 vault 级公开或半公开元信息
- 不存储明文秘密
推荐字段:
vault_id TEXT PRIMARY KEYformat_version TEXT NOT NULLcreated_at TEXT NOT NULLupdated_at TEXT NOT NULLdefault_tiga_mode TEXT NOT NULLactive_key_epoch_id TEXT NOT NULLcompat_flags TEXT NOT NULLcritical_extensions TEXT NOT NULL
3.2 projects
用途:
project是主容器- 所有密码类内容必须可归属于某个 project
推荐字段:
project_id TEXT PRIMARY KEYtitle_ct BLOB NOT NULLsummary_ct BLOB NULLgroup_id TEXT NULLicon_ref TEXT NULLfavorite INTEGER NOT NULL DEFAULT 0archived INTEGER NOT NULL DEFAULT 0deleted INTEGER NOT NULL DEFAULT 0tiga_mode_override TEXT NULLobject_clock TEXT NOT NULLhead_commit_id TEXT NOT NULLattachment_count INTEGER NOT NULL DEFAULT 0created_at TEXT NOT NULLupdated_at TEXT NOT NULLcreated_by_device_id TEXT NOT NULLupdated_by_device_id TEXT NOT NULL
索引建议:
idx_projects_updated_atidx_projects_group_ididx_projects_deletedidx_projects_head_commit_id
3.3 entries
用途:
- 存储 project 内部的登录项、笔记、卡片、身份、TOTP、Passkey 等
推荐字段:
entry_id TEXT PRIMARY KEYproject_id TEXT NOT NULLentry_type TEXT NOT NULLtitle_ct BLOB NULLpayload_ct BLOB NOT NULLpayload_schema_version INTEGER NOT NULLtiga_mode_override TEXT NULLobject_clock TEXT NOT NULLhead_commit_id TEXT NOT NULLdeleted INTEGER NOT NULL DEFAULT 0created_at TEXT NOT NULLupdated_at TEXT NOT NULLcreated_by_device_id TEXT NOT NULLupdated_by_device_id TEXT NOT NULL
约束:
project_id必须引用projects.project_id- 所有秘密型 entry 数据必须放入
payload_ct - 不允许把敏感字段拆成明文列
索引建议:
idx_entries_project_ididx_entries_typeidx_entries_updated_atidx_entries_deleted
3.4 attachments
用途:
- 存储附件元数据
- 支持 project 级附件和 entry 级附件
推荐字段:
attachment_id TEXT PRIMARY KEYproject_id TEXT NOT NULLentry_id TEXT NULLfile_name_ct BLOB NOT NULLmedia_type_ct BLOB NULLstorage_mode TEXT NOT NULLcontent_hash TEXT NOT NULLoriginal_size INTEGER NOT NULLstored_size INTEGER NOT NULLchunk_count INTEGER NOT NULL DEFAULT 0head_commit_id TEXT NOT NULLdeleted INTEGER NOT NULL DEFAULT 0created_at TEXT NOT NULLupdated_at TEXT NOT NULLcreated_by_device_id TEXT NOT NULLupdated_by_device_id TEXT NOT NULL
约束:
project_id必须存在entry_id可空,但如果存在必须引用entries.entry_id- 附件改名不得改变
content_hash - 附件元数据与附件内容必须解耦
索引建议:
idx_attachments_project_ididx_attachments_entry_ididx_attachments_content_hashidx_attachments_deleted
3.5 attachment_chunks
用途:
- 存储大型附件的分块内容或块引用
推荐字段:
attachment_id TEXT NOT NULLchunk_index INTEGER NOT NULLchunk_hash TEXT NOT NULLchunk_ct BLOB NULLexternal_uri_ct BLOB NULLstored_size INTEGER NOT NULLcreated_at TEXT NOT NULLPRIMARY KEY (attachment_id, chunk_index)
约束:
chunk_ct与external_uri_ct至少一个存在chunk_index必须从0开始连续递增
3.6 commits
用途:
- 记录每次本地变更或合并操作
推荐字段:
commit_id TEXT PRIMARY KEYdevice_id TEXT NOT NULLlocal_seq INTEGER NOT NULLcommit_kind TEXT NOT NULLchange_scope TEXT NOT NULLchanged_object_ids_ct BLOB NOT NULLvector_clock TEXT NOT NULLmessage_ct BLOB NULLcreated_at TEXT NOT NULLintegrity_tag BLOB NOT NULL
约束:
(device_id, local_seq)必须唯一local_seq必须单调递增
索引建议:
uniq_commits_device_seqidx_commits_created_atidx_commits_device_id
3.7 commit_parents
用途:
- 记录 commit DAG 关系
推荐字段:
commit_id TEXT NOT NULLparent_commit_id TEXT NOT NULLPRIMARY KEY (commit_id, parent_commit_id)
3.8 device_heads
用途:
- 记录每台设备当前可见的 head
推荐字段:
device_id TEXT PRIMARY KEYhead_commit_id TEXT NOT NULLlast_seen_at TEXT NOT NULLrevoked INTEGER NOT NULL DEFAULT 0
3.9 branches
用途:
- 逻辑分支引用
推荐字段:
branch_id TEXT PRIMARY KEYbranch_name TEXT NOT NULLhead_commit_id TEXT NOT NULLcreated_at TEXT NOT NULLupdated_at TEXT NOT NULL
3.10 object_versions
用途:
- 保存对象在指定 commit 的行级快照
- 支持 base/local/incoming 三方合并与单条目回滚
推荐字段:
object_type TEXT NOT NULLobject_id TEXT NOT NULLcommit_id TEXT NOT NULLsnapshot_ct BLOB NOT NULLcreated_at TEXT NOT NULLPRIMARY KEY (object_type, object_id, commit_id)
约束:
commit_id应引用commits.commit_idsnapshot_ct存储序列化后的对象行快照;敏感字段仍应保持密文或由加密层保护- v1 至少必须覆盖
entry
索引建议:
idx_object_versions_objectidx_object_versions_commit
3.11 tombstones
用途:
- 存储删除标记,防止并发同步时误复活
推荐字段:
tombstone_id TEXT PRIMARY KEYtarget_object_type TEXT NOT NULLtarget_object_id TEXT NOT NULLdelete_clock TEXT NOT NULLdeleted_by_device_id TEXT NOT NULLdeleted_at TEXT NOT NULLpurge_eligible_at TEXT NULL
索引建议:
idx_tombstones_targetidx_tombstones_deleted_at
3.12 snapshots
用途:
- 记录恢复检查点
推荐字段:
snapshot_id TEXT PRIMARY KEYbase_commit_id TEXT NOT NULLsnapshot_ct BLOB NOT NULLsnapshot_hash TEXT NOT NULLcreated_at TEXT NOT NULLcreated_by_device_id TEXT NOT NULL
3.13 key_epochs
用途:
- 管理密钥轮换
推荐字段:
key_epoch_id TEXT PRIMARY KEYstatus TEXT NOT NULLwrapped_epoch_key_ct BLOB NOT NULLkdf_profile_id TEXT NOT NULLcreated_at TEXT NOT NULLactivated_at TEXT NULLretired_at TEXT NULL
4. 建议关系图
逻辑关系如下:
text
vault
-> projects
-> entries
-> attachments
-> attachment_chunks
-> commits
-> commit_parents
-> object_versions
-> device_heads
-> branches
-> tombstones
-> snapshots
-> key_epochs5. 最小 SQL 原型约束
低端模型在写 SQL 草案时,至少要体现:
projects存在entries.project_id存在attachments.project_id存在attachments.entry_id可空commits与commit_parents支持 DAGobject_versions支持 entry 的 commit 快照tombstones支持延迟清理
6. 禁止事项
以下 schema 设计不合格:
- 没有
projects表 entries不归属于 project- 附件只是某个 JSON 大字段中的匿名数组
- 大附件和普通元数据强耦合,导致小修改也重写大块内容
- 没有
commits或没有tombstones
7. MVP 实现顺序建议
建议低端模型按这个顺序落地 schema:
vault_metaprojectsentriesattachmentsattachment_chunkscommitscommit_parentsdevice_headsbranchesobject_versionstombstonessnapshotskey_epochsconflicts
8. 验收标准
一个合格的 v1 schema 至少应满足:
- 能表达
project -> entry主关系 - 能表达
project -> attachment与entry -> attachment - 能在不重写附件内容的情况下修改项目元数据
- 能表达 commit DAG
- 能表达 entry 的 commit 快照,用于字段级三方合并
- 能表达 tombstone
- 能支持后续 KDBX 导入映射
