spacetimedb-tables について
SpacetimeDB モジュールのテーブル設計とアクセスパターンを扱うリファレンススキルです。TypeScript、C#、Rust、C++ の開発者向けに、インデックス、公開範囲、移行、イベント、スケジュールを解説します。
主な機能
- 01各言語のテーブル宣言パターン
- 02テーブル公開範囲とアクセス指針
- 03インデックス選択と性能の助言
- 04移行と列のデフォルト値の規則
- 05イベント・スケジュールテーブルの指針
活用シーン
- 01SpacetimeDB モジュールのスキーマ設計
- 02頻繁なクエリ向けのインデックス選択
- 03公開済みテーブルの安全な変更
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ danmossa/ spacetimedb-skills --skill spacetimedb-tablesインストール後、Claude Code で/spacetimedb-tablesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/tables-access-permissions.mdtables-auto-increment.mdtables-column-types.mdtables-constraints.mdtables-default-values.mdtables-event-tables.mdtables-file-storage.mdtables-indexes.mdtables-performance.mdtables-schedule-tables.mdtables.md詳細
モジュールのスキーマとテーブルのパフォーマンスには、このスキルを使用してください。
テーブルの基本パターン
TypeScript のテーブルでは table(options, columns) を使用し、オブジェクトとして schema() に渡す必要があります。
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 を使用してください。ダイレクトインデックスは密な符号なし整数キー向けであり、すべての言語でサポートされているわけではありません。
- 既存の公開済みテーブルに列を追加する場合は、デフォルト値を設定し、末尾に追加する必要があります。既存のスキーマを変更する前に、データベースのマイグレーションルールを確認してください。
- 自動インクリメント値はデータベースによって生成され、トランザクションの失敗後に欠番が生じることがあります。
- 追記専用のクライアント通知にはイベントテーブルを使用してください。イベントフラグは公開後に変更できません。
- スケジュールテーブルには
ScheduleAt列と、リンクされたスケジュール済みリデューサーが必要です。TypeScript では、ScheduleAtをspacetimedb/serverではなくspacetimedbからインポートしてください。
リファレンス一覧
ガイダンス
- 既存のスキーマを変更する前に、spacetimedb-databases でマイグレーションへの影響を確認してください。
- 頻繁に実行されるリデューサーの処理経路や、大きなテーブルに触れる処理経路では、インデックスを使った検索を優先してください。
- 特に、リデューサーの結果コールバックパターンを置き換える場合は、追記専用のクライアント通知にイベントテーブルを使用してください。
コメント
Markdown 対応