---
title: "ソロアーティスト データ設計書"
---

最終更新: 2026-09-30
関連 Issue: MorningStatusApp#1673（ソロ活動およびユニット活動の調査）/ morning-status-blume#167（初版作成）

## 1. 概要

メンバー個人の名義で活動するソロアーティストを管理するデータ設計。ソロアーティスト（`SoloArtist`）は `solos.json` で管理する。

ソロアーティスト一覧画面・ソロアーティスト詳細画面・メンバー詳細画面のソロ活動セクションの前提基盤となる（画面設計 → [ソロアーティスト 画面設計書](/design/solo/solo-screen-design)）。

---

## 2. 背景・目的

| 目的 | 詳細 |
| --- | --- |
| ソロ名義活動の管理 | MorningStatusApp#1673 のMusicBrainz調査で見つかった、メンバー本人の実名義によるソロ作品（19名・170件超）を一元管理する |
| メンバーとの紐付け | `memberId` により `members.json` の既存データと連携する |
| リリースとの紐付け | `releaseIds` により `Release`（Neon）の既存データと連携する |

ソロ活動を扱うために `solos.json` を新設する。

### 対象範囲

- **対象**: メンバー本人の実名義での発表のみ
- **対象外**: MusicBrainz上で別名義のユニットとして登録されている活動（例: 「後浦なつみ」名義）。これらはユニットとして `units.json` に登録する（MorningStatusApp#1681）

---

## 3. 型定義

### ソロアーティスト（`SoloArtist`）（`types/solos.ts`）

型はZodスキーマ（`SoloArtistSchema`）から `z.infer` で導出する。

```typescript
export const SoloArtistSchema = z.object({
  /** 対象メンバーの ID（members.json の id と一致。1メンバーにつき1エントリ）。ソロアーティスト詳細画面の URL の識別子を兼ねる */
  memberId: z.string(),
  /** ソロアーティストとしての名義（メンバー名と異なる場合のみ設定。省略時はメンバー名を表示する。例: 久住小春は「月島きらり starring 久住小春（モーニング娘。）」） */
  name: z.string().optional(),
  /** 関連リリースの ID 一覧（Release の id。sync-discography が自動集約して書き戻す） */
  releaseIds: z.array(z.string()).optional(),
  /** 活動開始年（YYYY 形式） */
  activeFrom: z.string(),
  /** 活動終了年（YYYY 形式。現役の場合は省略） */
  activeTo: z.string().optional(),
  /** MusicBrainz artist MBID の一覧（リリースごとにクレジットされる MBID が異なる場合があるため複数指定できる） */
  mbids: z.array(z.string()).optional(),
});

export type SoloArtist = z.infer<typeof SoloArtistSchema>;
```


---

## 4. データファイル

### solos.json（Vercel Blob）

- Vercel Blob で管理し、ローカルにフリーズドコピーは持たない
- `solos.json` は実装時に新規作成する（初期登録は §7）
- 作成後、`releaseIds` は `sync-discography` が自動集約して書き戻す（§6）
- 1メンバーにつき1エントリ（`memberId` は一意）

**Blobの検出方式**: 専用の環境変数（URL固定）は用いず、`@vercel/blob` の `list({ prefix: 'solos.json' })` でBlobを都度検出する。取得URLにはetagをクエリパラメータとして付与し、`fetch` は `cache: 'no-store'` で呼ぶ。`sync-discography` の書き戻しで `solos.json` が更新された直後に、CDNエッジキャッシュ経由で更新前のデータが返ることを避けるためで、画面側の取得処理にも必要になる。

### サンプルデータ

```json
[
  {
    "memberId": "member-id-1",
    "releaseIds": ["release-id-1", "release-id-2"],
    "activeFrom": "2001",
    "mbids": ["00000000-0000-0000-0000-000000000000"]
  },
  {
    "memberId": "member-id-2",
    "name": "月島きらり starring 久住小春（モーニング娘。）",
    "activeFrom": "2006",
    "activeTo": "2011",
    "mbids": [
      "8a193d6b-05f1-4487-bc16-bc958d300d0b",
      "e118ba73-c310-4934-a323-dc20fb1d693a"
    ]
  }
]
```

---

## 5. フィールド詳細

| フィールド | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `memberId` | `string` | ✅ | 対象メンバーの ID（`members.json` の `id` と一致）。ファイル内で一意 |
| `name` | `string` | — | ソロアーティストとしての名義。メンバー名と異なる場合のみ設定する（例: 久住小春は「月島きらり starring 久住小春（モーニング娘。）」） |
| `releaseIds` | `string[]` | — | 関連リリースの ID 一覧（`Release` の `id` と一致）。`sync-discography` が自動集約する |
| `activeFrom` | `string` | ✅ | 活動開始年（YYYY 形式） |
| `activeTo` | `string` | — | 活動終了年（YYYY 形式）。現役の場合は省略 |
| `mbids` | `string[]` | — | MusicBrainz artist MBID の一覧。設定すると `sync-discography` のリリース取得対象になり、`releaseIds` の自動集約が働く。未設定のエントリは `releaseIds` を手動管理する |

### 整合性ルール

| ルール | 内容 |
| --- | --- |
| メンバーの実在 | `memberId` は `members.json` に存在する `id` であること |
| 一意性 | 同一 `memberId` のエントリは1件のみ |
| 年の形式 | `activeFrom`・`activeTo` は `YYYY` 形式で、`activeTo` は `activeFrom` 以降であること |

---

## 6. リリースとの紐付け（`sync-discography` の拡張）

新規の同期スクリプトは作らず、既存の `sync-discography`（→ [バッチ設計書](/design/common/batch-design) W2）を拡張してソロアーティストを同じ処理に含める。

### 6-1. リリース取得対象のMBID

ユニットの `mbid` に加えて、`solos.json` の `mbids` も取得対象に含める（重複排除は合算後の一覧に対して行う）。`solos.json` が存在する場合に対象とする。

### 6-2. `releaseIds` の自動集約（`assignReleaseIdsToSoloArtists`）

全トラックの `Track.artistMbid` が、同一のソロアーティストの `mbids` のいずれかに含まれるリリースを、当該ソロアーティストの `releaseIds` に自動追加する。既存の `releaseIds` は保持し重複は除去する。

- 他アーティストとの共演曲・コンピレーション等でトラックの `artistMbid` が混在するリリースは対象外
- `releaseIds` の自動集約後、`solos.json` をVercel Blobに書き戻す

### 6-3. `Track` 型は変更しない

ソロアーティスト用のトラック紐付けフィールド（例: `Track.soloMemberId`）は追加しない。ソロアーティストとリリースの紐付けは `SoloArtist.releaseIds` で、ソロアーティストとトラックの紐付けは表示時の `Track.artistMbid` が `SoloArtist.mbids` に含まれるかの判定で表現し、`Track`・`Release` のスキーマ（Neon）は変更しない。

---

## 7. 初期登録対象

MorningStatusApp#1673 の調査で、`members.json` の全メンバー51名のうち19名にソロ名義の作品（170件超）が見つかっている。調査結果（メンバー・作品数・活動期間・MBID）は同Issueのコメントを参照する。

久住小春は、MusicBrainzの久住小春（`8a193d6b-…`、11件）の作品が「月島きらり starring 久住小春（モーニング娘。）」名義で、月島きらり（`e118ba73-…`、Character、10件）にも同名義の作品が登録されている。リリースごとにクレジットされるMBIDが異なる可能性があるため、両方を `mbids` に登録する。

登録時の留意点:

- メンバー本人の実名義での発表のみを対象とする。別名義のユニットとして登録されている活動はソロアーティストと誤認しない（§2）
- `activeFrom`・`activeTo` は、調査時にMusicBrainzのリリースグループ日付から機械的に算出した推定値。登録前に個別確認が必要

---

## 8. データ取得層の設計方針

Server Componentでの直接取得とし、Route Handler（BFF）+ TanStack Queryは適用しない。判定の理由は[統合フィードアイテム データ設計書](/design/common/feed-data-design) §6-9 を参照。

---

## 9. 関連設計書

| 設計書 | 本書との関係 |
| --- | --- |
| [ソロアーティスト 画面設計書](/design/solo/solo-screen-design) | 本データを表示する画面の設計 |
| [バッチ設計書](/design/common/batch-design) | `sync-discography` の処理フロー |
| [データ設計書（全体概要）](/design/common/data-design) | エンティティ一覧・データファイル一覧への登録 |

---

## 改訂履歴

| 版 | 更新日 | 変更内容 |
| --- | --- | --- |
| 1.0 | 2026-09-30 | 【対応する実装: 実装時に追記】初版作成（MorningStatusApp#1673, morning-status-blume#167） |
