---
title: "世代マトリックス データ設計書"
---

最終更新: 2026-09-20
関連 Issue: MorningStatusApp#1571（親Issue）/ #128（本Issue）/ MorningStatusApp#1632（実装）

---

## 1. 概要

OGメンバーの子供の誕生年と、現役メンバーの誕生年が交差する「世代の重なり」を年×メンバーのグリッドで可視化する世代マトリックス（Generational Matrix）機能のデータ設計。

親Issue（MorningStatusApp#1571）での検討の結果、以下の方針で設計する。

- OGの子供について、性別・氏名等の機微な属性は一切保持せず、**生年（西暦）のみ**を新規データとして追加する
- 既存の Vercel Blob 書き込みはすべて `access: 'public'` であり非公開データの置き場に使えないため、子供の生年データは **Neon（Vercel Postgres）に格納する**
- 画面自体もナビゲーションから一切リンクしない隠しルートとし、加えてシークレットモード（本書§3）で保護する。詳細な画面仕様は [世代マトリックス 画面設計書](/design/member/generational-matrix-screen-design) を参照

本人（OG・現役問わず全メンバー）の生年月日は既存の `Member.profile.dob`（Vercel Blob `members.json`）をそのまま使う。新規に追加するのは子供の生年データのみ。

---

## 2. テーブル設計

### 2-1. `member_children`（MemberChild）

OGメンバーの子供1人につき1レコードを持つ。同じメンバーが複数の子供を持つ場合は複数行になる（一意制約なし）。

| カラム | 型 | 制約 | 説明 |
|---|---|---|---|
| `id` | INT | PK, AUTO INCREMENT | ID |
| `memberId` | VARCHAR(50) | NOT NULL | 親であるメンバーの ID（Blob `members.json` の `Member.id` を参照。`member_relationships`（[メンバー関係性マップ データ設計書](/design/member/member-map-data-design) §2-1）と同様、DBレベルのFK制約は持たない） |
| `birthYear` | INT | NOT NULL | 子供の生年（西暦）。月日は保持しない |

- **インデックス:** `memberId`（単列）
- Prisma モデル名: `MemberChild`（`@@map("member_children")`）
- 運用上、`memberId` は現時点でOGメンバーのみを想定する（現役メンバーの子供は本書執筆時点で公表情報が存在しないため）。ただしDBレベルでOG限定を強制する制約は設けない。将来的に現役メンバーの子供が公表された場合も、同じテーブル・同じ手順でそのまま追加できる

氏名・性別・誕生日（月日）を持たない理由は本書§1の通り。「本人（`*`）」「子供（`+`）」の描画仕様は [世代マトリックス 画面設計書](/design/member/generational-matrix-screen-design) §3を参照。

---

## 3. シークレットモードのアクセス制御

環境変数・ガード関数の定義は [環境変数一覧](/design/common/environment-variables) §4「シークレットモードとは」を正とする。本節では世代マトリックスに固有の認証フローのみを記載する。

- **合言葉の検証**: `POST /api/secret-mode/verify`（body: `{ passcode: string }`）で `process.env.SECRET_MODE_PASSCODE` と一致するか検証する
- **セッションCookie**: 検証成功時、`secret_mode_session` という httpOnly Cookie を発行する（`secure`: 本番のみ、`sameSite: 'lax'`、有効期限30日）。値は `{expiresAt(epoch秒)}.{signature}` の形式で、`signature` は `SECRET_MODE_PASSCODE` を鍵とした `crypto.createHmac('sha256', ...)` によるHMAC署名（Node.js標準の `crypto` モジュールのみで完結させ、新規パッケージは追加しない）
- **検証**: `requireSecretMode()`（`lib/secret-mode.ts`）が `secret_mode_session` Cookieを読み、`expiresAt` を鍵に再計算した署名と一致し、かつ `expiresAt` が現在時刻より未来であることを確認する。いずれかを満たさない場合は未認証として扱う
- デスクトップモード（`requireDesktopMode()`、`lib/desktop-mode.ts`）は「ビルド時に固定される実行モード」を見るだけの単純な環境変数チェックだが、シークレットモードは「同一デプロイ上でブラウザセッションごとに認証状態が変わる」ため、Cookie発行・署名検証が必要になる点がデスクトップモードとの違い

---

## 4. データ投入運用

子供の生年データは今後も継続的に追加・更新される想定のため、拡張可能な手動運用スクリプトとして設計する。既存の手動登録スクリプト（`scripts/console/register-tour-festival.ts` 等）と同じ「CSV入力 → スクリプト実行 → Neonへ反映」のパターンを踏襲する。

- **スクリプト**: `scripts/console/import-member-children.ts`（実装は MorningStatusApp#1632）
- **入力**: `data/inputs/member-children.csv`（1行目ヘッダー: `memberId,birthYear`）
- **動作**: CSVの各行を `member_children` にINSERTする。既存の完全一致行（同じ `memberId`・`birthYear`）がある場合はスキップし重複登録を防ぐ（一意制約はテーブル側に持たせず、スクリプト側のロジックで判定する。同じ親から同じ年に複数の子供が生まれるケース（双子等）は稀だが、その場合は完全一致になり後発分がスキップされてしまうため、既知の制約として実装Issue側に申し送る）
- **`--dry-run`**: 実データへの書き込み前に差分（追加予定行）を表示するドライランモードを持たせる（本リポジトリの手動データ操作スクリプトの既定パターン）

初期データ投入時は、本書§5の参考データをCSV化して1回だけ実行する想定。

---

## 5. 初期データ（参考データ）

親Issue（MorningStatusApp#1571）のコメントに記載された実データ。列＝メンバー（誕生年順）、行＝西暦年、セル内 `*` は本人の誕生年、`+` は子供の誕生年を表す。表記ゆれ・体裁は原文のまま記録する（CSV化・整形は実装Issue側で行う）。

### 6期まで（ママがたくさん）

```
|    |中澤裕子|石黒彩|安倍なつみ|飯田圭織|福田明日香|保田圭 |矢口真里|市井紗耶香|後藤真希|石川梨華|吉澤ひとみ|辻希美|加護亜依|高橋愛 |紺野あさ美|小川麻琴|新垣里沙|藤本美貴|亀井絵里|道重さゆみ|田中れいな
|----|-------|-----|--------|-------|--------|------|------|---------|-------|------|--------|-----|-------|------|--------|-------|------|-------|-----|----|----
|1973| *
|1978|       | *    |
|1980|       |      |       |       |        | *          
|1981|       |      | *     | *     
|1983|       |      |       |       |        |      | *    | *        
|1984|       |      |       |       | *
|1985|       |      |       |       |        |      |      |         | *     | *    | *    |       |       |      |       |       |       | *
|1986|       |      |       |       |        |      |      |         |       |      |      |       |       | *
|1987|       |      |       |       |        |      |      |         |       |      |      | *     |       |      | *     | * 
|1988|       |      |       |       |        |      |      |         |       |      |      |       | *     |      |       |       | *     |       | *
|1989|       |      |       |       |        |      |      |         |       |      |      |       |       |      |       |       |       |       |     | *     | *
|2000|       | +
|2002|       | +
|2004|       | +    |       |       |        |      |      | +
|2007|       |      |       |       |        |      |      | +       |       |      |      | +
|2010|       |      |       |       |        |      |      |         |       |      |      | +
|2012| +     |      |       |       |        |      |      |         |       |      |      |       | +     |      |       |       |       | +
|2013|       |      |       | +     |        |      |      | +       |       |      |      | +
|2015| +     |      |       |       | +      |      |      |         | +     |      |      |       |       |      |       |       |       | +
|2016|       |      | +     |       |        |      |      |         |       |      | +    |       |       |      |       | +
|2017|       |      |       |       |        |      |      | +       | +     |      |      |       | +     |      | +
|2018|       |      | +     | +     |        | +    |      |         |       | +    |      | +
|2019|       |      |       |       |        |      | +    |         |       |      |      |       |       |      | +
|2020|       |      |       |       |        |      |      |         |       | +    |      |       |       |      |       |       |       | +
|2021|       |      |       |       |        |      | +    |         |       |      |      |       |       |      | +  
|2022|       |      | +
|2024|       |      |       |       |        |      |      |         |       |      |      |       |       |      | +     |       |      |      |       |      | +
|2025|       |      |       |       |        |      |      |         |       |      |      | +
|2026|       |      |       |       |        |      |      |         |       |      |      |       |       |      |       |       | +
```

### 7期から14期

```
|    |久住小春|光井愛佳|ジュンジュン|リンリン|譜久村聖|生田衣梨奈|鞘師里保|鈴木香音|飯窪春菜 |石田亜佑美|佐藤優樹 |工藤遥 |小田さくら|尾形春水|野中美希|牧野真莉愛|羽賀朱音|加賀楓 |横山玲奈|森戸知沙希
|----|-------|------|----------|-------|-------|------|-------|-------|---------|--------|-----|---------|------|--------|-------|-------|------|-----|----|----
|1988|       |      | *
|1991|       |      |           | *
|1992| *
|1993|       | *
|1994|       |      |           |      |        |         |       |       | *
|1996|       |      |           |      | *
|1997|       |      |           |      |       | *        |        |      |       | *
|1998|       |      |           |      |       |          | *      | *
|1999|       |      |           |      |       |          |        |      |       |         | *      | *    | *     | *     | *     |      |      | * 
|2000|       |      |           |      |       |          |        |      |       |         |        |      |       |       |       |      |      |     |       | *
|2001|       |      |           |      |       |          |        |      |       |         |        |      |       |       |       | *    |      |     | *
```

### 15期以降

```
|    |北川莉央|岡村ほまれ|山﨑愛生|櫻井梨央|井上春華|弓桁朱琴|杉原明紗|安田美結|鈴木もあ|石川華望
|----|-------|--------|-------|------|-------|------|-------|-------|-------|-----
|2004| *
|2005|       | *      | *     | *  
|2006|       |        |       |      | *
|2008|       |        |       |      |       | *
|2011|       |        |       |      |       |       | *
|2012|       |        |       |      |       |       |      | *
|2013|       |        |       |      |       |       |      |       | *     | *
```

---

## 改訂履歴（バージョン降順に記載）

| 版 | 更新日 | 変更内容 |
|---|---|---|
| 1.0 | 2026-09-20 | 初版作成（morning-status-blume#128） |
