🏗️ 架构概述
┌─────────────────────────────────────────┐
│ Client Applications │
│ (Unity / Unreal / Web / Mobile) │
└─────────────────────────────────────────┘
↓↑
┌─────────────────────────────────────────┐
│ SpaceTimeDB │
├─────────────────────────────────────────┤
│ Module (WASM/V8) │
│ ├── Tables (数据存储) │
│ ├── Reducers (业务逻辑) │
│ ├── Views (查询视图) │
│ └── Procedures (存储过程) │
├─────────────────────────────────────────┤
│ Subscriptions (实时订阅) │
│ Auth (身份认证) │
│ Commit Log (持久化) │
└─────────────────────────────────────────┘
📦 Module(模块)
模块是代码单元,定义数据库的 Schema 和业务逻辑:
- Tables - 定义数据结构
- Reducers - 修改数据的函数
- Views - 自定义查询
- Procedures - 存储过程
模块 vs 数据库
- 模块 - 你写的代码(Schema + 逻辑)
- 数据库 - 模块的运行实例 + 存储的数据
- 一个模块可部署到多个数据库(测试/生产环境)
📊 Tables(表)
定义数据结构,类似关系数据库的表:
#[spacetimedb::table(accessor = messages, public)]
pub struct Message {
#[primary_key]
#[auto_inc]
id: u64,
sender: Identity,
text: String,
}⚡ Reducers(归约器)
修改数据库状态的唯一方式,类似 RPC 端点:
#[spacetimedb::reducer]
pub fn send_message(ctx: &ReducerContext, text: String) {
ctx.db.messages().insert(Message {
id: 0,
sender: ctx.sender,
text,
});
}
每个 Reducer 在事务中执行,保证原子性。
👁️ Views(视图)
自定义查询逻辑,可被订阅:
// 定义视图
SPACETIMEDB_VIEW(std::optional<Player>, my_player, Public, ViewContext ctx) {
return ctx.db[player_identity].find(ctx.sender);
}
// 订阅视图
SELECT * FROM my_player;🔔 Subscriptions(订阅)
客户端订阅数据变化,自动接收更新:
// 客户端订阅 const [messages] = useTable(tables.message); // messages 自动更新,无需轮询