database-design

star 6

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

wfukatsu By wfukatsu schedule Updated 2/18/2026

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

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.md Transaction 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を使用する場合、テーブルごとの配置を決定します。

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

質問例:

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

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

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

配置戦略の例:

テーブル種別 推奨ストレージ 理由
トランザクションテーブル PostgreSQL/MySQL ACID保証、結合クエリ
イベントログテーブル 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型 備考 参照
UUID TEXT 文字列として格納 research/05_database_investigation.md
Enum TEXT 文字列として格納 同上
日時 BIGINT エポックミリ秒 同上
金額 BIGINT 最小単位(円、セント)で格納 同上
JSON TEXT シリアライズして格納 同上
ファイル 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 ストレージ選定基準

ストレージ 適用場面 特性
PostgreSQL ACID重視、複雑なクエリ、小〜中規模 トランザクション処理、結合クエリ
MySQL ACID重視、一般的な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

配置例:

サービス テーブル ストレージ 理由
order orders PostgreSQL トランザクション処理、ACID保証
order order_items PostgreSQL 親テーブルと同一DB(結合クエリ)
event events Cassandra 高スループット、時系列データ
audit audit_logs Cassandra 追記のみ、長期保存
metadata transaction_metadata PostgreSQL トランザクション制御

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対応、マルチストレージ強化 |
Install via CLI
npx skills add https://github.com/wfukatsu/coding-agent-for-scalardb --skill database-design
Repository Details
star Stars 6
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator