🏗️ 架构概述

┌─────────────────────────────────────────┐
│            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 自动更新,无需轮询
← 上一页:核心特性下一页:安装部署 →