# 第 2 章：データモデリング — 2 つのテーブルでチケットシステムを完成

前の章で NocoBase をインストールし、インターフェースを理解しました。ここからは、チケットシステムの骨格を組み立てます——**データモデル**の定義です。

この章では、チケットと分類の 2 つの[データテーブル](/data-sources/data-modeling/collection)を作成し、[フィールドタイプ](/data-sources/data-modeling/collection-fields)（単行テキスト、ドロップダウン選択、[多対一](/data-sources/data-modeling/collection-fields/associations/m2o)リレーションなど）を設定して、テーブル間のリレーションを構築します。データモデルはシステムの基盤です。どのデータを保存するか、データ同士がどう関係しているかを先に整理しておけば、後のインターフェース構築や権限設定がスムーズに進みます。


## 2.1 データテーブルとフィールドとは

Excel を使ったことがあれば、データテーブルの理解は簡単です。

| Excel の概念 | NocoBase の概念 | 説明 |
|------------|--------------|------|
| ワークシート | データテーブル（Collection） | ある種類のデータを格納するコンテナ |
| 列見出し | フィールド（Field） | データの属性を記述する |
| 各行 | レコード（Record） | 1 件の具体的なデータ |

![02-data-modeling-2026-03-11-08-32-41](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-32-41.png)

たとえば、これから作る「チケットテーブル」は Excel の表のようなものです。各列がフィールド（タイトル、ステータス、優先度……）、各行が 1 件のチケットレコードになります。

ただし、NocoBase は Excel よりもはるかに強力です。複数の**データテーブルタイプ**をサポートしており、タイプごとに異なる機能が備わっています。

| テーブルタイプ | 適した場面 | 例 |
|--------|---------|------|
| **通常テーブル** | ほとんどの業務データ | チケット、注文、顧客 |
| **ツリーテーブル** | 階層関係のあるデータ | カテゴリ分類、部門組織図 |
| カレンダーテーブル | 日付イベント | 会議、シフト |
| ファイルテーブル | 添付ファイル管理 | ドキュメント、画像 |

今回は**通常テーブル**と**ツリーテーブル**を使います。他のタイプは必要になったときに学びましょう。

**データソース管理に入る**：左下の **「データソース管理」** アイコン（歯車の隣のデータベースアイコン）をクリックすると、「[メインデータソース](/data-sources)」が表示されます。すべてのテーブルはここに作成します。

![02-data-modeling-2026-03-11-08-35-08](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-35-08.png)


## 2.2 コアテーブルの作成：チケット

本題に入りましょう。まずシステムのコアとなるチケットテーブルを作成します。

### テーブルの作成

1. データソース管理ページで **メインデータソース** をクリックして開きます

![02-data-modeling-2026-03-11-08-36-06](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-36-06.png)

2. **「データテーブルを作成」** をクリックし、**「通常テーブル」** を選択します

![02-data-modeling-2026-03-11-08-38-52](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-38-52.png)

3. データテーブル名：`tickets`、データテーブルタイトル：`チケット`

![02-data-modeling-2026-03-11-08-40-34](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-40-34.png)

テーブル作成時、システムはデフォルトで**システムフィールド**のセットにチェックを入れます。各レコードのメタ情報が自動的に記録されます。

| フィールド | 説明 |
|------|------|
| ID | 主キー、分散一意識別子 |
| 作成日時 | レコードの作成時間 |
| 作成者 | 誰がこのレコードを作成したか |
| 最終更新日時 | 最後に更新された時間 |
| 最終更新者 | 最後に更新したユーザー |

これらのシステムフィールドはデフォルトのままで構いません。手動で管理する必要はありません。特定の場面で不要な場合は、チェックを外すこともできます。

### 基本フィールドの追加

テーブルが作成できたら、次はフィールドを追加します。チケットテーブルの **「フィールドを設定（Configure fields）」** をクリックすると、先ほどデフォルトのシステムフィールドがリストに表示されています。

![02-data-modeling-2026-03-11-08-58-48](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-58-48.png)

![02-data-modeling-2026-03-11-08-59-47](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-08-59-47.png)

右上の **「フィールドを追加（Add field）」** ボタンをクリックすると、フィールドタイプのドロップダウンリストが展開されます。追加したいフィールドタイプを選択してください。

![02-data-modeling-2026-03-11-09-00-22](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-00-22.png)

まずチケット自体のフィールドを追加し、リレーションフィールドは後で追加します。

**1. タイトル（単行テキスト）**

各チケットには、問題を簡潔にまとめるタイトルが必要です。**「フィールドを追加」** → **[「単行テキスト」](/data-sources/data-modeling/collection-fields/basic/input)** を選択します。

![02-data-modeling-2026-03-11-09-01-00](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-01-00.png)

- フィールド名：`title`、フィールドタイトル：`タイトル`
- **「バリデーションルールを設定」** をクリックし、**「必須」** ルールを追加します

![02-data-modeling-2026-03-11-09-02-40](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-02-40.png)

**2. 説明（Markdown(Vditor)）**

問題を詳細に説明するためのフィールドで、書式設定に対応し、画像やコードの貼り付けが簡単にできます。「フィールドを追加」→「Media」カテゴリには 3 つの選択肢があります。

| フィールドタイプ | 特徴 |
|---------|------|
| Markdown | 基本的な Markdown、シンプルなスタイル |
| Rich Text | リッチテキスト、シンプルなスタイル + 添付ファイルアップロード |
| **Markdown(Vditor)** | 最も機能豊富。WYSIWYG、インスタントレンダリング、ソースコード編集の 3 つのモードに対応 |

ここでは **Markdown(Vditor)** を選びます。

![02-data-modeling-2026-03-11-09-09-58](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-09-58.png)

- フィールド名：`description`、フィールドタイトル：`説明`

![02-data-modeling-2026-03-11-09-10-50](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-10-50.png)

**3. ステータス（ドロップダウン - 単一選択）**

![02-data-modeling-2026-03-11-09-12-00](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-12-00.png)
チケットの提出から完了まで、進捗を追跡するためのステータスが必要です。

- フィールド名：`status`、フィールドタイトル：`ステータス`
- 選択肢を追加（各選択肢には「オプション値」と「オプションラベル」を入力し、色は任意）：

| オプション値 | オプションラベル | 色 |
|--------|---------|------|
| pending | 未対応 | Orange（日暮） |
| in_progress | 対応中 | Blue（拂晓蓝） |
| completed | 完了 | Green（極光緑） |

![02-data-modeling-2026-03-11-09-17-44](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-17-44.png)

まず選択肢を入力して保存します。その後、再度フィールドの **「編集（Edit）」** をクリックすると、「デフォルト値」で **「未対応」** を選択できるようになります。

![02-data-modeling-2026-03-11-09-20-28](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-20-28.png)

![02-data-modeling-2026-03-11-09-22-34](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-22-34.png)

> 初回作成時にはまだ選択肢データが存在しないため、デフォルト値を選べません。保存してから再度設定してください。

> なぜドロップダウン単一選択を使うのか？ステータスは固定の選択肢であり、[ドロップダウン](/data-sources/data-modeling/collection-fields/choices/select)を使うことでユーザーが自由入力するのを防ぎ、データの一貫性を保つことができます。

**4. 優先度（ドロップダウン - 単一選択）**

チケットの緊急度を区別し、担当者が優先度順に対応できるようにします。

- フィールド名：`priority`、フィールドタイトル：`優先度`
- 選択肢を追加：

| オプション値 | オプションラベル | 色 |
|--------|---------|------|
| low | 低 | |
| medium | 中 | |
| high | 高 | Orange（日暮） |
| urgent | 緊急 | Red（薄暮） |

ここまでで、チケットテーブルには 4 つの基本フィールドが追加されました。しかし、チケットには「分類」が必要ですよね？たとえば「ネットワーク問題」「ソフトウェア障害」など。

分類をドロップダウンで作ることもできますが、すぐに問題が見つかるでしょう。分類にはサブ分類がある可能性があります（「ハードウェア問題」の下に「ディスプレイ」「キーボード」「プリンター」など）。ドロップダウンでは対応しきれません。

分類を専門に管理する**もう 1 つのテーブル**が必要です。しかも、NocoBase の**ツリーテーブル**で作るのが最適です。


## 2.3 分類ツリーテーブルの作成：分類に階層を持たせる

### ツリーテーブルとは

ツリーテーブルは特殊なデータテーブルで、**親子関係**を組み込みでサポートします。各レコードは「親ノード」を持つことができます。階層構造を持つデータには最適です。

```
ハードウェア問題      ← 第 1 階層
├── ディスプレイ      ← 第 2 階層
├── キーボード・マウス
└── プリンター
ソフトウェア障害
├── オフィスソフト
└── システム問題
ネットワーク問題
アカウント権限
```

通常テーブルの場合、「親分類」フィールドを手動で作成してこの関係を実現する必要があります。一方、**ツリーテーブルは自動的にこれを処理してくれ**、ツリー表示や子レコードの追加などの操作もサポートするため、手間が大幅に省けます。

### テーブルの作成

1. データソース管理に戻り、**「データテーブルを作成」** をクリックします
2. 今度は **「ツリーテーブル」**（通常テーブルではありません！）を選択します
![02-data-modeling-2026-03-11-09-26-07](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-26-07.png)

3. データテーブル名：`categories`、データテーブルタイトル：`チケット分類`

![02-data-modeling-2026-03-11-09-26-55](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-26-55.png)

> 作成後、テーブルにはシステムフィールドに加えて **「Parent」** と **「Children」** の 2 つのリレーションフィールドが自動的に表示されます。これがツリーテーブルの特別な機能です。Parent で親ノードに、Children ですべての子ノードにアクセスでき、手動で追加する必要はありません。

![02-data-modeling-2026-03-11-09-27-40](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-27-40.png)

### フィールドの追加

**「フィールドを設定」** をクリックしてフィールドリストに入ると、システムフィールドと自動生成された Parent、Children フィールドが確認できます。
右上の **「フィールドを追加」** をクリックします。

**フィールド 1：分類名**

1. **「単行テキスト」** を選択
2. フィールド名：`name`、フィールドタイトル：`分類名`
3. **「バリデーションルールを設定」** をクリックし、**「必須」** ルールを追加

**フィールド 2：色**

1. **「色」** を選択
2. フィールド名：`color`、フィールドタイトル：`色`

![02-data-modeling-2026-03-11-09-28-59](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-28-59.png)

色フィールドにより、各分類に識別色を付けることができ、インターフェースに表示する際により直感的になります。

![02-data-modeling-2026-03-11-09-29-23](https://static-docs.nocobase.com/02-data-modeling-2026-03-11-09-29-23.png)

ここまでで、2 つのデータテーブルの基本フィールドの設定が完了しました。次はテーブル同士をリレーションで結びましょう。


## 2.4 チケットテーブルに戻る：リレーションフィールドの追加

> **リレーションフィールドは初めてだと少し抽象的かもしれません。** もし理解しにくいと感じたら、先に[第 3 章：ページを構築する](./03-building-pages)に進み、実際のページ操作でデータがどのように表示されるかを体験してから、ここに戻ってリレーションフィールドを追加しても問題ありません。

チケットは分類、提出者、担当者とリレーションを持つ必要があります。こうしたフィールドは**リレーションフィールド**と呼ばれ、「タイトル」のように直接テキストを保存するのではなく、別テーブルのレコードの ID を保存し、その ID を通じて対応するレコードを見つけます。

具体的なチケットを例に見てみましょう。左側がチケットの各属性で、「分類」と「提出者」にはテキストではなく ID が格納されています。システムはこの ID を使って、右側のテーブルから対応するレコードを正確に見つけます。


![02-data-modeling-2026-03-12-00-50-10](https://static-docs.nocobase.com/02-data-modeling-2026-03-12-00-50-10.png)

インターフェースに表示されるのは名前（「ネットワーク問題」「田中さん」）ですが、裏では ID によるリレーションで紐づいています。**複数のチケットが同じ分類や同じユーザーを指すことができます**——このリレーションを[**多対一**](/data-sources/data-modeling/collection-fields/associations/m2o)と呼びます。

### リレーションフィールドの追加

チケットテーブルの「フィールドを設定」→「フィールドを追加」に戻り、**「多対一」** を選択します。
![02-data-modeling-2026-03-12-00-52-39](https://static-docs.nocobase.com/02-data-modeling-2026-03-12-00-52-39.png)

作成時には以下の設定項目が表示されます。

| 設定項目 | 説明 | 入力方法 |
|--------|------|--------|
| ソースデータテーブル | 現在のテーブル（自動入力済み） | 変更不要 |
| **ターゲットデータテーブル** | どのテーブルにリレーションするか | 対応するテーブルを選択 |
| **外部キー** | 現在のテーブルに保存されるリレーション列名 | わかりやすい名前を入力 |
| ターゲットデータテーブル識別フィールド | デフォルト `id` | デフォルトのままで OK |
| ON DELETE | ターゲットレコード削除時の処理方式 | デフォルトのままで OK |

![02-data-modeling-2026-03-12-00-58-38](https://static-docs.nocobase.com/02-data-modeling-2026-03-12-00-58-38.png)

> 外部キーはデフォルトでランダムな名前（例：`f_xxxxx`）が自動生成されますが、わかりやすい名前に変更することをお勧めします。後のメンテナンスが楽になります。命名は小文字のアルファベットとアンダースコア（例：`category_id`）を使い、キャメルケースは避けてください。

この方法で 3 つのフィールドを順番に追加します。

**5. 分類 → チケット分類テーブル**

- フィールドタイトル：`分類`
- ターゲットデータテーブル：**「チケット分類」** を選択（リストにない場合はテーブル名を入力すると自動作成されます）
- 外部キー：`category_id`

**6. 提出者 → ユーザーテーブル**

このチケットを誰が提出したかを記録します。NocoBase にはユーザーテーブルが組み込まれているので、直接リレーションするだけです。

- フィールドタイトル：`提出者`
- ターゲットデータテーブル：**「ユーザー」** を選択
- 外部キー：`submitter_id`
![02-data-modeling-2026-03-12-01-00-09](https://static-docs.nocobase.com/02-data-modeling-2026-03-12-01-00-09.png)

**7. 担当者 → ユーザーテーブル**

このチケットを誰が対応しているかを記録します。

- フィールドタイトル：`担当者`
- ターゲットデータテーブル：**「ユーザー」** を選択
- 外部キー：`assignee_id`

![02-data-modeling-2026-03-12-01-00-22](https://static-docs.nocobase.com/02-data-modeling-2026-03-12-01-00-22.png)


## 2.5 データモデルの全体像

ここまでで構築したデータモデルの全体を振り返りましょう。

![02-data-modeling-2026-03-16-00-30-35](https://static-docs.nocobase.com/02-data-modeling-2026-03-16-00-30-35.png)

`}o--||` は多対一リレーションを表します。左側が「多」、右側が「一」です。


## まとめ

この章ではデータモデリング、つまりチケットシステム全体の骨格を完成させました。

1. **チケットテーブル**（tickets）：4 つの基本フィールド + 3 つのリレーションフィールド、**通常テーブル**で作成
2. **チケット分類テーブル**（categories）：2 つのカスタムフィールド + 自動の Parent/Children フィールド、**ツリーテーブル**で作成し、階層分類をネイティブにサポート

いくつかの重要な概念を学びました。

- **データテーブル（Collection）** = ある種類のデータを格納するコンテナ
- **データテーブルタイプ** = 場面に応じて異なるタイプを選択（通常テーブル、ツリーテーブル……）
- **フィールド（Field）** = データの属性。「フィールドを設定」→「フィールドを追加」で作成
- **システムフィールド** = ID、作成日時、作成者など。テーブル作成時に自動でチェック
- **リレーションフィールド（多対一）** = 別テーブルのレコードを指し示し、テーブル間のリレーションを構築

> 以降のスクリーンショットにはすでにデータが入っていますが、これはデモ用に事前に入力したテストデータです。焦らないでください。NocoBase では、データの追加・削除・更新・参照はすべてフロントエンドのページで行います。第 3 章ではデータを表示するテーブルを構築し、第 4 章ではデータを入力するフォームを作成していきます。


## 次の章のプレビュー

骨格ができましたが、まだ空のテーブルだけです。次の章では、ページを構築してデータを実際に表示できるようにします。

次の章でお会いしましょう！

## 関連リソース

- [データソース概要](/data-sources) — NocoBase データモデリングのコア概念
- [データテーブルフィールド](/data-sources/data-modeling/collection-fields) — すべてのフィールドタイプの詳細
- [多対一リレーション](/data-sources/data-modeling/collection-fields/associations/m2o) — リレーション設定の説明
