---
title: "ユニット一覧機能 データ設計書"
---

最終更新: 2026-04-10（#618）

## 1. 概要

`units.json` にユニットデータを管理するためのデータ設計。
ユニット一覧・詳細ページ（#535・#536）、メンバー詳細への所属ユニットセクション追加（#537）、
リリース詳細へのユニット情報追加（#538）の前提基盤となる。

---

## 2. 背景・目的

| 目的 | 詳細 |
| --- | --- |
| ユニットデータの管理 | ユニット名・所属メンバー・活動期間を一元管理する |
| メンバーとの紐付け | `memberIds` により `members.json` の既存データと連携する |
| リリースとの紐付け | `releaseIds` により `releases.json` の既存データと連携する（任意） |

---

## 3. 型定義

### `Unit` インターフェース（`types/unit.ts`）

```typescript
export interface Unit {
  /** ユニットの識別子（kebab-case。例: morning-musume-25） */
  id: string;
  /** ユニット名 */
  name: string;
  /** 所属メンバーの ID 一覧（members.json の id フィールドと一致） */
  memberIds: string[];
  /** 関連リリースの ID 一覧（releases.json の id フィールド。省略可） */
  releaseIds?: string[];
  /** 活動開始年（YYYY 形式） */
  activeFrom: string;
  /** 活動終了年（YYYY 形式。現役の場合は省略） */
  activeTo?: string;
  /** 上位ユニットの ID（kebab-case。各期ユニットに設定する。上位ユニット・単独ユニットは省略） */
  parentId?: string;
}
```

---

## 4. データファイル

### units.json（Vercel Blob）

- Vercel Blob（`UNITS_BLOB_URL`）で管理。ローカルにフリーズドコピーは持たない
- `id`・`name`・`memberIds`・`mbid` 等は手動入力で維持する（`releaseIds` のみ `sync-discography` が自動集約して書き戻す）
- 初期データ: 15件収録（タンポポ・プッチモニ・ミニモニ。・さくら組・おとめ組・エコモニ。・W・誕生10年記念隊・ドリームモーニング娘。）

#### ユニット種別と運用ルール

| 種別 | 説明 | `parentId` | `memberIds` | `releaseIds` |
| --- | --- | --- | --- | --- |
| 上位ユニット | 複数期をまとめる親。一覧・詳細ページに表示される | なし（省略） | `[]`（空配列） | 省略可。全期横断のリリースがある場合のみ設定する |
| 各期ユニット | 上位ユニットの配下。一覧には表示されない | 上位ユニットの `id` | 実際の所属メンバー ID | 当該期のリリース ID |
| 単独ユニット | 期別区分のないユニット | なし（省略） | 実際の所属メンバー ID | 実際のリリース ID |

#### サンプルデータ

```json
[
  {
    "id": "tanpopo",
    "name": "タンポポ",
    "memberIds": [],
    "activeFrom": "1998",
    "activeTo": "2004"
  },
  {
    "id": "tanpopo-1",
    "name": "タンポポ（第1期）",
    "memberIds": ["member-id-1", "member-id-2"],
    "releaseIds": ["release-id-1"],
    "activeFrom": "1998",
    "activeTo": "2001",
    "parentId": "tanpopo"
  }
]
```

---

## 5. フィールド詳細

| フィールド | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string` | ✅ | ユニットの識別子（kebab-case） |
| `name` | `string` | ✅ | ユニット名 |
| `memberIds` | `string[]` | ✅ | 所属メンバーの ID 一覧（`members.json` の `id` と一致） |
| `releaseIds` | `string[]` | — | 関連リリースの ID 一覧（`releases.json` の `id` と一致） |
| `activeFrom` | `string` | ✅ | 活動開始年（YYYY 形式） |
| `activeTo` | `string` | — | 活動終了年（YYYY 形式）。現役ユニットは省略 |
| `parentId` | `string` | — | 上位ユニットの ID（`units.json` の `id` と一致）。各期ユニットのみ設定する |

---

## 6. トラックとの紐づけ（#562）

`Track` 型に以下のフィールドが追加され、`sync-discography` 実行時に自動設定される。

| フィールド（Track） | 型 | 説明 |
| --- | --- | --- |
| `artist` | `string`（省略可） | MusicBrainz artist-credit から取得したアーティスト名 |
| `unitId` | `string`（省略可） | `units.json` の `id` と一致するユニット ID。`artist` がユニット名と一致した場合に付与 |

### 照合ロジック

1. `artist` とユニット名の完全一致を試みる
2. 完全一致なしの場合、括弧前のベース名（例: "タンポポ（第1期）" → "タンポポ"）でグループ化し、リリース年が `activeFrom`〜`activeTo` に含まれる期を選択
3. 境界年で複数期が重なる場合は `activeFrom` が最大の期（最新期）を採用
4. 既存の `unitId` は上書きしない（手動設定を保護）

---

## 改訂履歴

| 版 | 更新日 | 変更内容 |
| --- | --- | --- |
| 1.4 | 2026-04-10 | §4 サンプルデータのタンポポ ID を `tanpopo` / `tanpopo-1` 形式に修正（#618） |
| 1.3 | 2026-04-05 | §6 トラックとの紐づけ追加（#562） |
| 1.2 | 2026-04-03 | 運用ルール表に `releaseIds` 列を追加（#559） |
| 1.1 | 2026-04-03 | `parentId` フィールド追加・上位ユニット運用ルール追加（#555） |
| 1.0 | 2026-03-30 | 初版作成（#532） |
