Database Architecture 摘要
文档概览
该来源页当前抓取到的正文非常少,几乎全部由一段 SQLite 触发器示例 SQL 组成。 可见内容并不是一份完整的“数据库架构”说明文档,而更像是围绕全文检索索引维护的实现片段。 因此,本页只能可靠整理出 observations_fts 与主数据表之间的同步方式,不能据此推断完整数据库设计。
关键事实
- 页面明确出现了 3 个触发器:
observations_ai、observations_au、observations_ad。 - 这 3 个触发器分别对应:
AFTER INSERTAFTER UPDATEAFTER DELETE
- 它们都挂在
observations表上执行。 - 它们的共同目标,是维护
observations_fts表中的全文检索索引内容,使其与observations的数据保持同步。
触发器与同步逻辑
observations_ai:插入后同步
源码示例说明:当 observations 表发生 INSERT 后,会立即向 observations_fts 写入一条对应记录。
该触发器的核心语句是直接执行:
INSERT INTO observations_fts(rowid, title, subtitle, narrative, text, facts, concepts)VALUES (new.id, new.title, new.subtitle, new.narrative, new.text, new.facts, new.concepts);
这意味着:
- FTS 表使用
rowid与主表记录关联。 - 新写入的 FTS 行以
new.id作为rowid。 - 同步字段包含:
title、subtitle、narrative、text、facts、concepts。
observations_au:更新后先删旧索引,再写新索引
源码示例说明:当 observations 表发生 UPDATE 后,触发器不会直接覆盖 FTS 内容,而是执行两步操作。
第一步是删除旧索引记录:
INSERT INTO observations_fts(observations_fts, rowid, title, subtitle, narrative, text, facts, concepts)VALUES('delete', old.id, old.title, old.subtitle, old.narrative, old.text, old.facts, old.concepts);
第二步是插入更新后的新索引记录:
INSERT INTO observations_fts(rowid, title, subtitle, narrative, text, facts, concepts)VALUES (new.id, new.title, new.subtitle, new.narrative, new.text, new.facts, new.concepts);
这表明更新流程是:
- 先按旧值删除旧的 FTS 索引项。
- 再按新值重建新的 FTS 索引项。
这里尤其要注意:删除旧索引并不是写 DELETE FROM observations_fts ...,而是使用了 FTS 常见的特殊写法:
INSERT INTO observations_fts(... ) VALUES('delete', ...)
从示例可知,这种写法至少在此处被用于按旧内容撤销已有全文索引,再重新写入新内容。
observations_ad:删除后只删索引
源码示例说明:当 observations 表发生 DELETE 后,触发器只执行索引删除,不再插入新记录。
对应语句为:
INSERT INTO observations_fts(observations_fts, rowid, title, subtitle, narrative, text, facts, concepts)VALUES('delete', old.id, old.title, old.subtitle, old.narrative, old.text, old.facts, old.concepts);
这表示:
- 删除主表记录后,会同步删除其 FTS 索引。
- 删除操作同样依赖旧记录内容
old.*。 - 这里再次使用了 FTS 的
'delete'插入语义,而不是普通表删除语句。
被同步的字段
从 3 个触发器的 SQL 可以直接确认,被同步到 observations_fts 的字段有:
titlesubtitlenarrativetextfactsconcepts
此外还可以确认关联键的表现形式:
- 插入和更新写入新索引时,使用
rowid = new.id。 - 更新和删除移除旧索引时,使用
rowid = old.id。
因此,当前来源至少表明:observations_fts 的全文索引项是围绕 observations.id 建立映射的。
重要细节
1. 当前可见内容是实现片段,不是完整架构说明
虽然页面标题是 Database Architecture,但此次抓取到的正文没有展示通常会期待的架构性内容,例如:
- 主表完整表结构
observations_fts的建表语句- 其他业务表及其关系
- 普通索引或联合索引定义
- 外键约束
- SQLite 版本或 FTS 版本(如 FTS5)
- WAL、事务、并发或性能策略
- 对这些触发器的解释性文字
因此,本页不能把这些缺失内容补写成既定事实,只能明确标注信息边界。
2. UPDATE 与 DELETE 都依赖旧值删除 FTS 索引
observations_au 与 observations_ad 都使用了:
VALUES('delete', old.id, old.title, old.subtitle, old.narrative, old.text, old.facts, old.concepts)
这说明删除索引时不仅依赖旧的 rowid,示例还显式带上了旧文本列值。
从来源可直接确认的是:文档示例要求按旧记录内容构造这条删除指令。
3. INSERT 不做删除,只做新增
observations_ai 没有任何清理动作。
它的逻辑非常直接:在 AFTER INSERT 后,把新记录字段复制到 observations_fts。
这也符合“新增主记录 -> 新增全文索引记录”的单向同步模式。
4. UPDATE 不是原地更新 FTS,而是重建
触发器示例没有展示任何类似 UPDATE observations_fts SET ... 的语句。
页面给出的明确模式是“删旧 + 插新”。
因此,至少在示例层面,该页采用的是重建全文索引项,而不是原地修改。
信息边界
根据当前抓取内容,以下信息均未展示,不能从本页确定:
observations表的完整列定义与数据类型observations.id是否主键、自增键或其他约束形式observations_fts的具体建表方式- 是否使用 SQLite FTS3 / FTS4 / FTS5
- 是否存在 tokenizer、分词器、停用词、ranking 配置
- 是否还有其他触发器、视图、迁移脚本或维护任务
- 整个数据库中除
observations与observations_fts外的其他表结构 - 页面原本是否还有解释文字但未被本次抓取成功提取
因此,当前最稳妥的结论是:该来源可靠证明了一个围绕 observations 与 observations_fts 的 SQLite 全文检索同步触发器方案,但不足以单独支撑完整的“数据库架构”全貌。