key フィールドと value フィールドを持つ小さな技術的なオブジェクトがあれば、ワークスペースをスコープとした永続的なキーバリューストアになり、既にレコード用に使用しているのと同じ 型付き API クライアントからクエリできます。
ストアオブジェクトを定義する
2 つのフィールドを持つカスタムオブジェクトを宣言します —key(一意な TEXT)と value(任意の JSON シリアライズ可能なペイロードを保存できるようにするための RAW_JSON)。 完全な defineObject のリファレンスについては Objects を参照してください。
src/objects/kv-store.object.ts
キーの一意性を保証する
key に対して一意インデックスを追加し、同じキーに 2 行が割り当てられないようにします。 これは一意性のために推奨されるプリミティブです。詳細は Data → Unique indexes を参照してください。
src/indexes/kv-store-key.index.ts
ロジック関数から読み書きする
オブジェクトをいくつかの小さなヘルパーでラップし、残りのコードをget、set、del を持つキーバリュー API のように記述できるようにします。 これらは CoreApiClient を使用します。これはワークスペースのスキーマから生成され、kvStore オブジェクトに対して完全に型付けされています。
src/logic-functions/handlers/kv-store.ts
一意インデックスは重複を防ぎますが、同じ新しいキーを 2 つの実行がまったく同時に書き込もうとした場合、ルックアップと作成の間で競合状態が発生する可能性があります。 作成が一意制約で失敗した場合は「他の誰かが勝った」と見なし、それをキャッチして再読み込みするか、更新としてリトライします。
使ってみる:高コストな呼び出しをキャッシュする
典型的な用途としては、遅い、またはレート制限されたサードパーティのレスポンスをキャッシュしておき、毎回コストを支払うのではなく、繰り返しの実行で再利用することが挙げられます。src/logic-functions/getExchangeRate.logic-function.ts
パターン & ヒント
- ネームスペース化。 さまざまな用途を分離し、まとめてルックアップしやすくするために、キーにプレフィックスを付けます —
sync-cursor:linear、cache:exchange-rate:USD:EUR、lock:nightly-report。key: { like: 'cache:%' }でフィルタリングして、ネームスペース全体を一覧表示またはクリアします。 - 期限 (TTL)。 ストアには組み込みの有効期限はありません。
value内にタイムスタンプを保存して(キャッシュの例のように)読み取り時にチェックするか、DATE_TIMEフィールドを追加し、cron-triggered function から定期的に古い行をクリアします。 - 何を保存するか。
RAW_JSONには、数値、文字列、配列、オブジェクトなど、任意の JSON シリアライズ可能な値を格納できます。 エントリは小さく保ってください。これは調整やキャッシュのためのものであり、大きな BLOB やファイル用ではありません。 ファイルにはFILESフィールドとuploadFileを使用してください。 - 可視性と権限。 行は他のレコードと同様にワークスペースのデータベース内に存在するため、API を通じてクエリでき、アプリの role に従った権限が適用されます。 ストアをメイン UI から隠しておきたい場合は、navigation menu に追加しないでください。
- レコードへのスコープ。 グローバルなキーではなく、レコード単位の状態が必要ですか? ストアオブジェクトから対象オブジェクトへの relation を追加し、id をキーにエンコードするのではなく関連付けを使います。
これは約束事であり、別個の機能ではありません。「KV Store」は、標準の API で定義およびクエリする、通常のカスタムオブジェクトにすぎません。 つまり、アプリの他のデータと同様に、同じ同期、権限、ツール群の恩恵を受けられます。