W
AI-Wiki
SOURCE

Database Architecture 摘要

文档概览

该来源页当前抓取到的正文非常少,几乎全部由一段 SQLite 触发器示例 SQL 组成。 可见内容并不是一份完整的“数据库架构”说明文档,而更像是围绕全文检索索引维护的实现片段。 因此,本页只能可靠整理出 observations_fts 与主数据表之间的同步方式,不能据此推断完整数据库设计。

关键事实

  • 页面明确出现了 3 个触发器:observations_aiobservations_auobservations_ad
  • 这 3 个触发器分别对应:
    • AFTER INSERT
    • AFTER UPDATE
    • AFTER 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
  • 同步字段包含:titlesubtitlenarrativetextfactsconcepts

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);

这表明更新流程是:

  1. 先按旧值删除旧的 FTS 索引项。
  2. 再按新值重建新的 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 的字段有:

  • title
  • subtitle
  • narrative
  • text
  • facts
  • concepts

此外还可以确认关联键的表现形式:

  • 插入和更新写入新索引时,使用 rowid = new.id
  • 更新和删除移除旧索引时,使用 rowid = old.id

因此,当前来源至少表明:observations_fts 的全文索引项是围绕 observations.id 建立映射的。

重要细节

1. 当前可见内容是实现片段,不是完整架构说明

虽然页面标题是 Database Architecture,但此次抓取到的正文没有展示通常会期待的架构性内容,例如:

  • 主表完整表结构
  • observations_fts 的建表语句
  • 其他业务表及其关系
  • 普通索引或联合索引定义
  • 外键约束
  • SQLite 版本或 FTS 版本(如 FTS5)
  • WAL、事务、并发或性能策略
  • 对这些触发器的解释性文字

因此,本页不能把这些缺失内容补写成既定事实,只能明确标注信息边界。

2. UPDATE 与 DELETE 都依赖旧值删除 FTS 索引

observations_auobservations_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 配置
  • 是否还有其他触发器、视图、迁移脚本或维护任务
  • 整个数据库中除 observationsobservations_fts 外的其他表结构
  • 页面原本是否还有解释文字但未被本次抓取成功提取

因此,当前最稳妥的结论是:该来源可靠证明了一个围绕 observationsobservations_fts 的 SQLite 全文检索同步触发器方案,但不足以单独支撑完整的“数据库架构”全貌。

相关条目