DynamoDB
概要
MBC CQRS ServerlessはDynamoDBをプライマリデータストアとして使用し、構造化されたテーブル設計を通じてCQRSとイベントソーシングパターンを実装しています。効率的なアプリケーションを構築するには、テーブル構造を理解することが重要です。
テーブルアーキテクチャ
MBC CQRS Serverlessでは、DynamoDBテーブルは以下のタイプに整理されています:
エンティティテーブル
| テーブルタイプ | 命名規則 | 用途 |
|---|---|---|
| コマンドテーブル | entity-command | 書き込みコマンドを保存(書き込みモデル) |
| データテーブル | entity-data | 現在の状態を保存(読み取りモデル) |
| 履歴テーブル | entity-history | イベントソーシング用にすべてのバー ジョンを保存 |
実際のテーブル名には環境名とアプリケーション名のプレフィックスが付きます: {NODE_ENV}-{APP_NAME}-{エンティティ}-{種別}(例: dev-myapp-order-command)。上記の名前は CommandModule.register({ tableName }) で使用される論理サフィックスです。
システムテーブル
| テーブル | 用途 |
|---|---|
tasks | 長時間実行される非同期タスクの情報を保存 |
sequences | ID生成用のシーケンスデータを保持 |
import_tmp | Step Functionsを介したインポート操作用の一時データを保存 |
session | Read-Your-Writes セッションの追跡(v1.2.0以降) |
テーブル定義
テーブル定義はprisma/dynamodbsフォルダに保存されています。新しいエンティティテーブルを追加するには:
ステップ1: 設定でテーブルを定義
prisma/dynamodbs/cqrs.jsonにテーブル名を追加:
["cat", "dog", "order"]
ステップ2: マイグレーションを実行
ローカル開発用:
# DynamoDB テーブルのみ移行
npm run migrate:ddb
# DynamoDB と RDS の両方を移行
npm run migrate
システムテーブル定義
システムテーブル(tasks、sequences、import_tmp、session)は prisma/dynamodbs/ フォルダに専用の JSON 定義ファイルを持ちます。これらはマイグレーション時に自動的に作成されます:
| ファイル | テーブル | 用途 |
|---|---|---|
tasks.json | tasks | DynamoDB Streamsによるタスク管理 |
sequences.json | sequences | シーケンスID生成 |
import_tmp.json | import_tmp | ImportModule用のDynamoDB Streams付き一時インポートデータ |
session.json | session | Read-Your-Writes セッションの追跡(v1.2.0以降)。コマンドサービスを参照 |
import_tmp.jsonテンプレートはバージョン1.1.1で追加されました。それ以前のバージョンでプロジェクトを作成し、ImportModuleを使用している場合は、このファイルを手動で追加する必要があります。詳細はよくある問題を参照してください。
キー設計パターン
標準キー構造
すべてのエンティティテーブルは複合主キーを使用します。DATAテーブルとCOMMANDテーブルは同じpk形式を使用しますが、skが異なります:
| テーブル | キー | 形式 | 例 |
|---|---|---|---|
| DATA / HISTORY | pk | TYPE#tenantCode | ORDER#ACME |
| DATA / HISTORY | sk | TYPE#code | ORDER#ORD-000001 |
| COMMAND | pk | TYPE#tenantCode | ORDER#ACME |
| COMMAND | sk | TYPE#code@version | ORDER#ORD-000001@1 |
COMMANDテーブルのソートキーにはフレームワークが付加する@{version}サフィックスが含まれます。DATAテーブルを照会する際はremoveSortKeyVersion(sk)(@mbc-cqrs-serverless/coreからインポート)を使用して削除してください。
エンティティキーの例
// Order entity (注文エンティティ)
const orderKey = {
pk: `ORDER#${tenantCode}`,
sk: `ORDER#${orderId}`,
};
// User entity (ユーザーエンティティ)
const userKey = {
pk: `USER#${tenantCode}`,
sk: `USER#${userId}`,
};
// Hierarchical data (e.g., organization) (階層データ(例: 組織))
const departmentKey = {
pk: `ORG#${tenantCode}`,
sk: `DEPT#${parentId}#${deptId}`,
};
テーブル属性
共通属性
すべてのエンティティテーブルはこれらの共通属性を共有します:
| 属性 | 型 | 説明 |
|---|---|---|
pk | String | パーティションキー |
sk | String | ソートキー |
id | String | 一意識別子(pk#sk、skから@versionを除去) |
code | String | ビジネスコード |
name | String | 表示名 |
tenantCode | String | テナント識別子 |
type | String | エンティティタイプ |
version | Number | 楽観的ロック用バージョン |
attributes | Map | カスタムエンティティ属性 |
createdBy | String | 作成者ユーザーID |
createdIp | String | 作成者IPアドレス |
createdAt | String | 作成タイムスタンプ(ISO 8601) |
updatedBy | String | 最終更新者ユーザーID |
updatedIp | String | 最終更新者IPアドレス |
updatedAt | String | 最終更新タイムスタンプ(ISO 8601) |
seq | Number | 順序付けのためのシーケンス番号 |