该技能用于 SpacetimeDB 模块的 schema 与表性能设计,适用于定义或修改表、列、约束、主键、唯一约束、索引、自增字段、默认值与事件表等场景。
表声明示例(TypeScript):import { schema, table, t } from "spacetimedb/server"; const player = table({ name: "player", public: true }, { id: t.u64().primaryKey().autoInc(), identity: t.identity().unique(), name: t.string().index("btree") }); export default schema({ player });
各语言差异:TypeScript 中 { name: "player_score" } 生成 ctx.db.playerScore;C# 用 [SpacetimeDB.Table(Accessor = "Player", Public = true)] 生成 ctx.Db.Player,类型须为 partial;Rust 用 #[spacetimedb::table(accessor = player, public)] 生成 ctx.db.player(),pub struct 本身不等于公开表;C++ 用 SPACETIMEDB_TABLE(Type, player, Public) 生成 ctx.db[player]。
设计规则:按访问与更新模式组织数据,把频繁更新的热状态与较少变动的资料、设置、统计拆分;公开表对客户端订阅可见,服务端专用状态应私有,必要时通过视图暴露派生子集;主键与唯一约束会自动建立索引,不要重复添加;仅对频繁的等值、范围、订阅或连接路径加索引,默认用 B-tree,direct 索引适用于密集无符号整数键且并非所有语言都支持;已发布表新增列需要默认值且必须追加在末尾,改 schema 前先查数据库迁移规则;自增值由数据库生成,事务失败后可能出现空档;事件表用于追加式客户端通知,发布后 event 标志不可更改;计划表需要 ScheduleAt 列并关联 scheduled reducer,TypeScript 中 ScheduleAt 要从 spacetimedb 导入而非 spacetimedb/server。
参考文档覆盖表定义、访问控制、ID 与默认值、列类型与约束、索引设计、事件表与计划表、文件存储与性能。修改现有 schema 前应查 spacetimedb-databases;高频 reducer 路径或大表优先使用索引查找。