本文へ移動
cccskills
無料GitHub で公開

database-design

ScalarDBを前提としたデータベース設計を行います。スキーマ設計、トランザクション設計、マルチストレージ構成を対話形式で決定し、スキーマファイルと設計書を生成します。

インストール方法を見る

含まれるファイル(1)

  • SKILL.md25.0 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Database Design Skill

目的

ScalarDBを使用したデータベース設計を行い、以下を生成します:

  • スキーマ設計書(テーブル定義、キー設計)
  • トランザクション設計書(パターン、分離レベル)
  • ScalarDBスキーマファイル(schema.json)
  • ScalarDB設定ファイル(scalardb.properties)

リファレンス資料

設計にあたっては、以下の資料を参照してください:

資料パス参照内容
論理データモデルパターンresearch/03_logical_data_model.mdエンティティ設計、正規化、リレーション
物理データモデル・PK/CK設計research/04_physical_data_model.mdパーティションキー、クラスタリングキー、インデックス戦略
対応DB一覧research/05_database_investigation.mdサポートDB、機能制約、データ型マッピング
v3.17メタデータ分離research/13_scalardb_317_deep_dive.mdTransaction Metadata Decoupling、メタデータテーブル設計
設計手順workflow/04_data_model_design.mdステップバイステップの設計プロセス
設計テンプレートworkflow/templates/data_model_template.md設計書のテンプレート

実行フロー

flowchart TD
    START[スキル開始] --> Q1[質問フェーズ1: 基本情報]
    Q1 --> Q2[質問フェーズ2: データモデル]
    Q2 --> Q3[質問フェーズ3: アクセスパターン]
    Q3 --> Q4[質問フェーズ4: トランザクション要件]
    Q4 --> Q5[質問フェーズ5: ScalarDB v3.17メタデータ構成]
    Q5 --> Q6[質問フェーズ6: マルチストレージ構成]
    Q6 --> DESIGN[スキーマ設計]
    DESIGN --> OUT[出力生成]

Stage 1: 要件ヒアリング

1.1 質問フェーズ1: 基本情報

質問項目説明例
プロジェクト名システム識別名pce-backend
サービス一覧マイクロサービス名audit, verification, event
バックエンドDB使用するストレージPostgreSQL, Cassandra
マルチテナントテナント分離要否Yes / No
ScalarDBバージョン使用バージョンv3.17以降 / v3.16以前

質問例:

プロジェクト名を教えてください。
どのようなサービス(マイクロサービス)がありますか?
バックエンドデータベースは何を使用しますか?
  1. PostgreSQL
  2. MySQL
  3. Cassandra
  4. DynamoDB
  5. 複数DB(マルチストレージ)
マルチテナント対応は必要ですか?
ScalarDBのバージョンはv3.17以降ですか?

1.2 質問フェーズ2: データモデル

質問項目説明デフォルト
エンティティ一覧主要なエンティティ-
エンティティ属性各エンティティの属性-
関連エンティティ間の関係-

質問例:

主要なエンティティ(テーブル)を教えてください。
各エンティティにはどのような属性がありますか?
エンティティ間の関連(1対多、多対多など)を教えてください。

参照: research/03_logical_data_model.md の論理データモデルパターンを参照

1.3 質問フェーズ3: アクセスパターン

質問項目説明例
主要クエリ頻繁に実行するクエリID検索、一覧取得
検索条件フィルタ条件ステータス、日付範囲
ソート順並び順作成日時降順

質問例:

主要なクエリパターンを教えてください:
  - どのような条件で検索しますか?
  - どのような順序でデータを取得しますか?
  - 範囲検索は必要ですか?

参照: research/04_physical_data_model.md のアクセスパターンとキー設計を参照

1.4 質問フェーズ4: トランザクション要件

質問項目説明デフォルト
トランザクション境界同時更新が必要なテーブル-
整合性要件強整合性が必要な操作SERIALIZABLE
サービス間連携分散トランザクション要否No

質問例:

複数テーブルを同時に更新する操作はありますか?
強い整合性が必要な操作はどれですか?
サービス間をまたぐトランザクションは必要ですか?
  1. 不要(単一サービス内で完結)
  2. 必要(Saga パターン使用)
  3. 必要(分散トランザクション)

1.5 質問フェーズ5: ScalarDB v3.17メタデータ構成

ScalarDB v3.17以降を使用する場合、Transaction Metadata Decouplingの構成を決定します。

質問項目説明デフォルト
メタデータ分離メタデータテーブルを別DBに配置No
メタデータDBメタデータ用のストレージ同一DB
コーディネーター配置coordinatorテーブルの配置先同一DB

質問例:

ScalarDB v3.17のTransaction Metadata Decouplingを使用しますか?
  1. 使用しない(従来通りビジネステーブルと同じDBに配置)
  2. 使用する(メタデータテーブルを別DBに分離)

メタデータテーブル(transaction_metadata, coordinator)を別DBに配置しますか?
  理由:
  - パフォーマンスの分離(ビジネステーブルとメタデータの負荷分離)
  - コスト最適化(高性能DBとコスト効率の良いDBの使い分け)
  - 運用の簡素化(メタデータのバックアップ・メンテナンス分離)

メタデータ用のストレージは何を使用しますか?
  1. PostgreSQL(ACID重視、管理容易)
  2. MySQL(一般的なRDB)
  3. Cassandra(高スケーラビリティ)
  4. DynamoDB(サーバーレス)

参照: research/13_scalardb_317_deep_dive.md の詳細な分析を参照

メタデータ分離の判断基準:

状況推奨構成理由
小規模システム(~100 TPS)分離しない運用がシンプル、オーバーヘッド最小
中規模システム(100-1000 TPS)状況に応じて負荷状況により判断
大規模システム(1000+ TPS)分離するパフォーマンス分離、スケーラビリティ向上
マルチストレージ構成分離を検討メタデータを統一的に管理
コスト重視分離する高性能DBとコスト効率DBの使い分け

1.6 質問フェーズ6: マルチストレージ構成

複数のバックエンドDBを使用する場合、テーブルごとの配置を決定します。

質問項目説明例
ストレージ一覧使用するDBpostgresql, cassandra
テーブル配置戦略どのテーブルをどのDBに配置するかトランザクション重視→PostgreSQL、イベント→Cassandra
デフォルトストレージ明示的に指定しない場合のDBpostgresql

質問例:

複数のバックエンドDBを使用しますか?

各テーブルをどのストレージに配置しますか?
判断基準:
  1. PostgreSQL/MySQL → ACID重視、複雑なクエリ、中小規模
  2. Cassandra → 高スケーラビリティ、書き込み重視、イベントログ
  3. DynamoDB → サーバーレス、自動スケーリング

デフォルトストレージ(明示的に指定しないテーブル用)はどれですか?

配置戦略の例:

テーブル種別推奨ストレージ理由
トランザクションテーブルPostgreSQL/MySQLACID保証、結合クエリ
イベントログテーブルCassandra/DynamoDB高スループット、時系列データ
監査ログテーブルCassandra/DynamoDB追記のみ、長期保存
マスターテーブルPostgreSQL/MySQL参照整合性、更新頻度低
メタデータテーブルPostgreSQL/MySQLトランザクション制御、一貫性

参照: research/05_database_investigation.md の各DBの特性を参照


Stage 2: スキーマ設計

2.1 ネームスペース設計

サービス別にネームスペースを分離:

{project}/
├── {service1}/
│   ├── {entity1}
│   └── {entity2}
├── {service2}/
│   └── {entity3}
└── coordinator/
    └── state (Sagaパターン使用時)

v3.17以降のメタデータテーブル:

  • scalardb.metadata.transaction_metadata (メタデータ分離時)
  • scalardb.metadata.coordinator (メタデータ分離時)

2.2 テーブル設計

キー選定基準:

キータイプ選定基準詳細
パーティションキーカーディナリティが高い属性(ID、テナントID等)research/04_physical_data_model.md 参照
クラスタリングキー範囲クエリ・ソートに使用する属性時系列データ、バージョン等
セカンダリインデックス頻繁な検索条件(注意: パフォーマンス影響あり)最小限に抑える

テーブル定義テンプレート:

{
  "{namespace}.{table}": {
    "transaction": true,
    "partition-key": ["{partition_key}"],
    "clustering-key": ["{clustering_key}"],
    "clustering-order": {"{clustering_key}": "ASC|DESC"},
    "columns": {
      "{column}": "{type}"
    },
    "secondary-index": ["{indexed_column}"]
  }
}

参照: workflow/templates/data_model_template.md のスキーマテンプレート

2.3 データ型マッピング

ドメイン型ScalarDB型備考参照
UUIDTEXT文字列として格納research/05_database_investigation.md
EnumTEXT文字列として格納同上
日時BIGINTエポックミリ秒同上
金額BIGINT最小単位(円、セント)で格納同上
JSONTEXTシリアライズして格納同上
ファイルBLOBバイナリとして格納同上

注意: バックエンドDBによってサポートされる型が異なります。詳細は research/05_database_investigation.md を参照。

2.4 逆引きテーブル設計

マテリアライズドビューの代替として逆引きテーブルを作成:

// 順方向: parent_id → children
{
  "children_by_parent": {
    "partition-key": ["parent_id"],
    "clustering-key": ["child_id"]
  }
}

// 逆方向: child_id → parent
{
  "parent_by_child": {
    "partition-key": ["child_id"],
    "columns": {
      "parent_id": "TEXT"
    }
  }
}

参照: research/03_logical_data_model.md の多対多リレーションパターン


Stage 3: トランザクション設計

3.1 トランザクションパターン

パターン適用条件実装
単一テーブル1テーブルのみ更新通常のput/delete
複数テーブル同一サービス内の複数テーブル単一トランザクション
Sagaサービス間連携補償トランザクション

3.2 分離レベル選択

操作タイプ推奨分離レベル
作成・更新・削除SERIALIZABLE
参照のみ(一覧取得等)SNAPSHOT
レポート・分析SNAPSHOT(または非トランザクション)

3.3 リトライ戦略

RetryTemplate.builder()
    .maxAttempts(3)
    .exponentialBackoff(100, 2, 1000)
    .retryOn(CrudConflictException.class)
    .retryOn(TransactionRetryableException.class)
    .build();

Stage 4: ScalarDB v3.17メタデータ構成設計

4.1 メタデータテーブルの理解

ScalarDB v3.17以降では、トランザクションメタデータを分離できます:

メタデータテーブル:

  1. transaction_metadata - トランザクションの状態管理
  2. coordinator - 2PCのコーディネーター情報

従来(v3.16以前):

  • ビジネステーブルごとにtx_id, tx_state, tx_version等のカラムが追加される
  • メタデータがビジネスデータと混在

v3.17以降(メタデータ分離):

  • メタデータが専用テーブルに分離
  • ビジネステーブルは純粋なビジネスデータのみ
  • メタデータテーブルを別DBに配置可能

4.2 メタデータ分離の設計判断

メタデータを分離する場合の設定:

# メタデータストレージの指定
scalar.db.transaction.metadata.storage=metadata_storage

# メタデータストレージの定義
scalar.db.storage.metadata_storage.type=jdbc
scalar.db.storage.metadata_storage.contact_points=jdbc:postgresql://metadata-db:5432/scalardb_metadata
scalar.db.storage.metadata_storage.username=metadata_user
scalar.db.storage.metadata_storage.password=metadata_pass

# ビジネスデータストレージ
scalar.db.storage.type=jdbc
scalar.db.storage.contact_points=jdbc:postgresql://business-db:5432/business_db

メリット:

  • パフォーマンス分離(メタデータアクセスの負荷がビジネスDBに影響しない)
  • コスト最適化(メタデータは低コストDBに、ビジネスは高性能DBに)
  • 運用の簡素化(メタデータのバックアップ・メンテナンスを独立管理)

デメリット:

  • 構成の複雑化
  • ネットワークレイテンシーの増加(別DBへのアクセス)
  • 運用管理対象の増加

参照: research/13_scalardb_317_deep_dive.md の詳細分析


Stage 5: マルチストレージ設計(オプション)

5.1 ストレージ選定基準

ストレージ適用場面特性
PostgreSQLACID重視、複雑なクエリ、小〜中規模トランザクション処理、結合クエリ
MySQLACID重視、一般的なWebアプリ広く普及、管理容易
Cassandra高スケーラビリティ、書き込み重視イベントログ、時系列データ
DynamoDBサーバーレス、自動スケーリング完全マネージド、従量課金

参照: research/05_database_investigation.md の各DBの詳細比較

5.2 テーブル配置戦略

配置の決定フロー:

flowchart TD
    START[テーブル] --> Q1{ACID重視?}
    Q1 -->|Yes| Q2{複雑なクエリ?}
    Q1 -->|No| Q3{高スループット?}
    Q2 -->|Yes| PG[PostgreSQL/MySQL]
    Q2 -->|No| Q3
    Q3 -->|Yes| Q4{時系列データ?}
    Q3 -->|No| PG
    Q4 -->|Yes| CASS[Cassandra/DynamoDB]
    Q4 -->|No| Q5{書き込み重視?}
    Q5 -->|Yes| CASS
    Q5 -->|No| PG

配置例:

サービステーブルストレージ理由
orderordersPostgreSQLトランザクション処理、ACID保証
orderorder_itemsPostgreSQL親テーブルと同一DB(結合クエリ)
eventeventsCassandra高スループット、時系列データ
auditaudit_logsCassandra追記のみ、長期保存
metadatatransaction_metadataPostgreSQLトランザクション制御

5.3 マッピング設定

# ストレージ定義
scalar.db.multi_storage.storages=postgresql,cassandra

# PostgreSQL設定
scalar.db.multi_storage.storages.postgresql.storage=jdbc
scalar.db.multi_storage.storages.postgresql.contact_points=jdbc:postgresql://postgres:5432/business
scalar.db.multi_storage.storages.postgresql.username=postgres
scalar.db.multi_storage.storages.postgresql.password=postgres

# Cassandra設定
scalar.db.multi_storage.storages.cassandra.storage=cassandra
scalar.db.multi_storage.storages.cassandra.contact_points=cassandra:9042
scalar.db.multi_storage.storages.cassandra.username=cassandra
scalar.db.multi_storage.storages.cassandra.password=cassandra

# ネームスペースマッピング
scalar.db.multi_storage.namespace_mapping=order:postgresql,event:cassandra,audit:cassandra

# デフォルトストレージ
scalar.db.multi_storage.default_storage=postgresql

# メタデータストレージ(v3.17以降)
scalar.db.transaction.metadata.storage=postgresql

Stage 6: 出力

6.1 出力ファイル

output/phase2/
└── 04_data_model_design.md         # データモデル設計書(統合)
    ├── 1. 概要
    ├── 2. ネームスペース構成
    ├── 3. テーブル定義
    ├── 4. アクセスパターン
    ├── 5. トランザクション設計
    ├── 6. ScalarDB v3.17メタデータ構成
    ├── 7. マルチストレージ構成
    └── 添付: schema.json, scalardb.properties

6.2 設計書テンプレート

output/phase2/04_data_model_design.md:

# データモデル設計書

## 1. 概要

| 項目 | 値 |
|------|-----|
| プロジェクト | {projectName} |
| バックエンドDB | {databases} |
| マルチテナント | {multiTenant} |
| ScalarDBバージョン | {scalardbVersion} |
| メタデータ分離 | {metadataDecoupling} |

## 2. ネームスペース構成

| ネームスペース | サービス | テーブル数 | ストレージ |
|--------------|---------|----------|----------|
| {namespace} | {service} | {count} | {storage} |

## 3. テーブル定義

### 3.1 {namespace}.{table}

| 項目 | 値 |
|------|-----|
| 説明 | {description} |
| ストレージ | {storage} |
| パーティションキー | {partitionKey} |
| クラスタリングキー | {clusteringKey} |
| セカンダリインデックス | {secondaryIndex} |

**カラム定義**:

| カラム | 型 | 説明 | 制約 |
|--------|-----|------|------|
| {column} | {type} | {description} | {constraints} |

**設計根拠**:
- パーティションキー選定理由: {reason}
- クラスタリングキー選定理由: {reason}
- ストレージ選定理由: {reason}

## 4. アクセスパターン

| パターンID | パターン | テーブル | クエリ | 頻度 | パフォーマンス |
|-----------|---------|---------|-------|------|--------------|
| {id} | {pattern} | {table} | {query} | {frequency} | {performance} |

**クエリ例**:
```java
// {patternDescription}
{queryExample}

5. トランザクション設計

5.1 トランザクション一覧

操作パターンテーブル分離レベル推定TPS
{operation}{pattern}{tables}{isolation}{tps}

5.2 トランザクション詳細

5.2.1 {operationName}

概要: {description}

対象テーブル:

  • {table1}
  • {table2}

シーケンス:

sequenceDiagram
    participant S as Service
    participant TX as Transaction
    participant T1 as Table1
    participant T2 as Table2

    S->>TX: start()
    TX->>T1: get/put
    TX->>T2: get/put
    S->>TX: commit()

例外処理:

例外対応
{exception}{handling}

リトライ戦略: {retryStrategy}

6. ScalarDB v3.17メタデータ構成

6.1 メタデータ分離設定

項目値
メタデータ分離{enabled/disabled}
メタデータストレージ{storage}
ビジネスストレージ{storage}

設計判断: {decisionRationale}

メタデータテーブル配置:

テーブルストレージ理由
transaction_metadata{storage}{reason}
coordinator{storage}{reason}

設定ファイル:

# メタデータ分離設定
{metadataConfig}

参照: research/13_scalardb_317_deep_dive.md

7. マルチストレージ構成

7.1 ストレージ一覧

ストレージIDタイプ用途接続情報
{id}{type}{purpose}{connection}

7.2 テーブル配置マップ

ネームスペーステーブルストレージ配置理由
{namespace}{table}{storage}{reason}

7.3 マッピング設定

# マルチストレージ設定
{multiStorageConfig}

配置戦略の根拠: {strategyRationale}

参照: research/05_database_investigation.md

8. 逆引きテーブル

元テーブル逆引きテーブル用途整合性維持方法
{source}{reverse}{purpose}{consistency}

9. パフォーマンス考慮事項

9.1 ボトルネック分析

懸念事項影響対策
{concern}{impact}{mitigation}

9.2 スケーラビリティ

項目現状目標スケーリング戦略
{item}{current}{target}{strategy}

10. 設計レビューチェックリスト

  • パーティションキーのカーディナリティは十分か
  • クラスタリングキーはアクセスパターンに合致しているか
  • セカンダリインデックスは最小限か
  • トランザクション境界は適切か
  • メタデータ分離の判断は妥当か
  • マルチストレージの配置は最適か
  • 逆引きテーブルの整合性維持方法は明確か

添付ファイル

A. schema.json

{schemaJson}

B. scalardb.properties

{scalardbProperties}

**参照**: `workflow/templates/data_model_template.md` の詳細テンプレート

---

## 使用例

### 例1: 基本的な使い方

Skill: database-design

プロジェクト名: pce-backend サービス: audit, verification, event バックエンドDB: PostgreSQL ScalarDBバージョン: v3.17


### 例2: マルチストレージ構成

Skill: database-design

プロジェクト名: enterprise-platform サービス: order, inventory, analytics バックエンドDB: PostgreSQL + Cassandra マルチテナント: Yes メタデータ分離: Yes(PostgreSQLに配置)


### 例3: メタデータ分離構成

Skill: database-design

プロジェクト名: high-scale-platform サービス: transaction, event バックエンドDB: Cassandra メタデータDB: PostgreSQL(分離) 理由: Cassandraの高スループットとPostgreSQLの強整合性を組み合わせ


### 例4: ドメインモデルからの設計

Skill: database-design

プロジェクト名: pce-backend ドメインモデル: output/phase2/03_domain_model.md 設計手順に従って対話的に設計を進める


---

## 注意事項

### 一般的な注意事項

- ScalarDBのセカンダリインデックスはパフォーマンスに影響するため、必要最小限に
- タイムスタンプはBIGINT(エポックミリ秒)で格納を推奨
- マルチテナントの場合、パーティションキーにtenant_idを含める
- 逆引きテーブルは両方向のデータ整合性を維持する必要あり

### ScalarDB v3.17固有の注意事項

- メタデータ分離を有効にする場合、メタデータストレージの可用性が全体の可用性に影響
- メタデータテーブルへのアクセスは頻繁に発生するため、レイテンシーに注意
- v3.16以前からのマイグレーションではスキーマ変更が必要
- メタデータ分離の有効化後は元に戻すのが困難

### マルチストレージ固有の注意事項

- クロスストレージの結合クエリは実行できない
- 各ストレージの制約(データ型、インデックス等)を考慮
- ストレージ間のレイテンシー差に注意
- トランザクションは複数ストレージにまたがることが可能だが、パフォーマンスに影響

### 設計のベストプラクティス

1. **アクセスパターン優先**: スキーマはクエリパターンから逆算して設計
2. **シンプルさ重視**: 複雑な設計は運用負荷を増加させる
3. **段階的な最適化**: 初期は単純な構成から始め、必要に応じて最適化
4. **ドキュメント重視**: 設計判断の根拠を明確に記録
5. **レビューの実施**: 設計完了後、チェックリストに基づいてレビュー

---

## 参照ワークフロー

設計の詳細な手順については、以下を参照してください:

- `workflow/04_data_model_design.md` - データモデル設計のステップバイステップ手順
- `workflow/templates/data_model_template.md` - 設計書の詳細テンプレート

---

## 更新履歴

| 日付 | バージョン | 変更内容 |
|------|----------|---------|
| 2026-02-17 | 1.0 | ScalarDB固有の設計スキルとして作成、v3.17対応、マルチストレージ強化 |

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

api-design

無料日本語概要

RESTful API の設計を行います。エンドポイント定義、リクエスト/レスポンス仕様、エラーハンドリング、ScalarDBトランザクション例外のマッピングを含みます。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

domain-modeling

無料日本語概要

DDDに基づいたドメインモデルを設計します。戦略的設計(境界コンテキスト、ユビキタス言語)と戦術的設計(エンティティ、値オブジェクト、集約、ドメインサービス、ドメインイベント)を定義し、ヘキサゴナルアーキテクチャとの統合を行います。ScalarDBのトランザクション境界や管理テーブル分類の考慮事項を含みます。中間状態はresearch/に記録されます。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

implementation-plan

無料日本語概要

設計ドキュメントに基づいて実装計画を生成します。ScalarDB特有のスキーマ定義、トランザクション実装、統合テストを含む実装可能なタスク指示書を作成し、フェーズ別の実装ロードマップを提供します。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

infrastructure-design

無料日本語概要

Kubernetes、Kong API Gateway、ScalarDB Cluster v3.17を使用したインフラストラクチャ設計を行います。マニフェストファイルと設定ファイルを生成します。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

scalardb-data-model

無料日本語概要

ScalarDBの制約を考慮したデータモデル設計を行います。Partition Key・Clustering Key・Secondary Index の設計、ホットスポット評価、メタデータオーバーヘッド見積もり、バックエンドDB選定を含みます。ワークフローStep 04(データモデル設計)で使用します。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

scalardb-transaction

無料日本語概要

ScalarDBのトランザクション設計を行います。トランザクション境界定義、パターン選定(単一集約内/2PC/Saga/ハイブリッド)、OCC競合率評価、バッチ処理設計、v3.17最適化適用計画を含みます。ワークフローStep 05(トランザクション設計)で使用します。

wfukatsu/coding-agent-for-scalardb62026年2月19日 更新

wfukatsu のスキルをすべて見る

このスキルの問題を報告する