用途
Schema Builder 用于设计并生成 Convex 数据库 schema,重点在于关系、索引与校验器的规范化。它适用于以下情况:创建新的 convex/schema.ts 文件;向现有 schema 添加表;设计数据模型关系;添加或优化索引;将嵌套数据转换为关系结构。
主要能力
该技能遵循一组 schema 设计原则:采用文档-关系式设计,即使用扁平文档配合 ID 引用,而非深层嵌套;对用于查找的外键字段(如 userId、teamId 等)建立索引;数组仅用于小型有界集合(少于 8192 项);通过 v.* 类型使用严格校验器保证类型安全。
资料中给出的 schema 模板展示了如何从 convex/server 导入 defineSchema 和 defineTable,从 convex/values 导入 v,并定义包含必填字段、可选字段、关系 ID、由 union 加 literal 构成的枚举以及时间戳的表,同时通过 .index() 建立按字段查询索引、复合索引和时间索引。
常见模式
资料列举了几种模式。一对一多关系示例中,users 表通过 by_email 索引,posts 表持有 userId 并建立 by_user 索引。多对多通过连接表实现,例如 projectMembers 表同时持有 userId 和 projectId,并建立 by_user、by_project 以及复合索引 by_project_and_user。层级数据示例中,comments 表使用可选的 parentId 指向自身(顶级评论为 null),并建立 by_post 和 by_parent 索引。小型有界数组示例中,users 表可包含 roles 和 tags 等小规模数组。
校验器参考
资料列出了可用的校验器:基本类型 v.string()、v.number()、v.boolean()、v.null()、v.id("tableName");可选类型 v.optional(v.string());联合类型(枚举)v.union(v.literal("a"), v.literal("b"));对象 v.object({...});数组 v.array(v.string());记录 v.record(v.string(), v.boolean());以及应尽量避免的 v.any()。
索引策略
单字段索引用于简单查找,如 by_user 和 by_email。复合索引用于过滤查询,如 by_user_and_status、by_team_and_created。资料指出应移除冗余索引,by_a_and_b 通常已覆盖 by_a。
检查清单
资料提供的检查清单包括:所有外键都有索引;常见查询模式有复合索引;数组小且有界(或已转为关系);所有字段都有合适的校验器;枚举使用 v.union(v.literal(...)) 模式;时间戳使用 v.number()(自 epoch 起的毫秒数)。
从嵌套迁移到关系结构
资料给出了迁移示例,将用户文档内嵌的 posts 数组及其嵌套 comments 数组,改为独立的 users、posts、comments 表,并通过 userId、postId 等 ID 引用和相应索引建立关系。
限制
资料未提供关于该技能的安装方式、收费模式、适用平台或具体使用步骤的信息。