データ設計書(全体概要)
最終更新: 2026-09-29(プレイリストデータのBlob→Neon移行)
1. 概要
MorningStatusApp が管理するデータファイル・エンティティの全体像をまとめた設計書。 各エンティティの詳細設計は個別設計書を参照すること。
ER 図(エンティティ間の関係図)→ ER 図
2. データファイル一覧
プライマリデータ(Vercel Blob + data/ 凍結コピー)
| ファイル名 | 概要 | 更新方法 |
|---|---|---|
members.json |
全メンバーのプロフィール・近況・SNS情報。Amebaブログの近況(Member.latestStatus/Member.statusHistory)も専用ファイルを持たずここに格納する(詳細 → Amebaブログ機能 データ設計書) |
編集 API(PUT /api/members)または手動更新 |
releases.json |
全リリース情報・収録曲トラックリスト | sync-discography スクリプト(自動)または手動 |
units.json |
ユニット情報(名称・所属メンバー・活動期間) | 手動編集後に Vercel Blob へアップロード |
radar-chart-timeline-config.json |
レーダーチャート時系列表示のキーフレーム終端日(keyframeEndDate)設定(詳細 → メンバー関係性マップ レーダーチャート画面設計書 §10-6) |
設定UI(PUT /api/radar-chart-timeline-config、デスクトップモードでのみ実行可能)または手動更新 |
tiktok-official-accounts.json |
TikTok公式アカウント一覧(詳細 → TikTok投稿機能 データ設計書 §3) | 管理UI(PUT /api/tiktok-official-accounts、デスクトップモードでのみ実行可能)または手動更新 |
instagram-official-accounts.json |
Instagram公式アカウント一覧(詳細 → Instagram投稿機能 データ設計書 §3) | 管理UI(PUT /api/instagram-official-accounts、デスクトップモードでのみ実行可能)または手動更新 |
Instagram投稿データ(Vercel Blob のみ・自動生成)
詳細設計 → Instagram投稿機能 データ設計書
| ファイルパス | 概要 | 生成タイミング |
|---|---|---|
instagram/{memberId}/posts.json |
メンバー単位の全投稿メタデータ(InstagramPost[]) |
collect-instagram-posts ワークフロー実行時 |
instagram/{memberId}/{postId}.jpg |
キャプチャ済投稿画像 | collect-instagram-posts ワークフロー実行時 |
instagram/sync-status.json |
同期実行状態(InstagramSyncStatus)。同期状況画面向け |
collect-instagram-posts ワークフロー実行時 |
instagram/daily-new-posts.json |
当日新規取得投稿一覧(DailyNewPost[])。トップ画面向け |
collect-instagram-posts ワークフロー実行時 |
Amebaブログ同期状態(Vercel Blob のみ・自動生成)
詳細設計 → Amebaブログ機能 データ設計書
| ファイルパス | 概要 | 生成タイミング |
|---|---|---|
ameba/sync-status.json |
Topページ新着投稿セクションの新着ウィンドウ判定に使う同期ステータス(AmebaSyncStatus) |
sync-members ワークフロー実行時 |
歌詞リンクデータ(Track.links に追記・Vercel Blob 更新)
詳細設計 → 歌詞サイトリンク機能 データ設計書
独立したファイルは持たず、
releases.jsonのTrack.links[]に{ type: 'genius', url }として追記する。
3. エンティティ一覧
| エンティティ | 格納場所 | 追加バージョン | 詳細設計書 |
|---|---|---|---|
メンバー(Member) |
Vercel Blob(members.json) / data/work/members.json(作業用一時コピー) |
v0.1.0〜 | メンバー データ設計書 |
リリース(Release) |
Neon(Vercel Postgres)release テーブル |
v0.2.0〜 | リリース データ設計書 |
メンバー・リリース紐付け(MemberReleaseLink) |
実行時算出(永続ファイルなし) | v0.2.0〜 | リリース データ設計書 §5 |
収録曲(Track) |
Neon(Vercel Postgres)track テーブル |
v0.5.0 | トラックリスト データ設計書 |
外部リンク(ExternalLink) |
Track.links[] / Release.links[] 内の値型 |
v0.5.0 | トラックリスト データ設計書 |
プレイリスト(Playlist) |
Neon(Vercel Postgres)※ 移行前までVercel Blob(data/inputs/playlists.json 凍結入力) |
v0.6.0【対応する実装: 実装時に追記(MorningStatusApp#1680)】 | プレイリスト機能 データ設計書 §7 |
プレイリスト楽曲(PlaylistEntry) |
Neon(Vercel Postgres)※ 移行前までdata/inputs/playlists.json 内 entries[] |
v0.6.0【対応する実装: 実装時に追記(MorningStatusApp#1680)】 | プレイリスト機能 データ設計書 §7 |
対比グループ(ComparisonGroup) |
Neon(Vercel Postgres) | v1.1.0【対応する実装: 実装時に追記(MorningStatusApp#1633)】 | 曲対比機能 データ設計書 |
対比グループ×トラック紐付け(ComparisonGroupTrack) |
Neon(Vercel Postgres) | v1.1.0【対応する実装: 実装時に追記(MorningStatusApp#1633)】 | 曲対比機能 データ設計書 |
ユニット(Unit) |
Vercel Blob(UNITS_BLOB_URL) |
v1.5.0 | ユニット一覧機能 データ設計書 |
会場(Venue) |
Neon(Vercel Postgres) | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
ツアー(Tour) |
Neon(Vercel Postgres) | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
公演(Live) |
Neon(Vercel Postgres) | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
メンバー・公演紐付け(MemberLive) |
Neon(Vercel Postgres) | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
都道府県コード変換テーブル(PrefectureCode) |
Neon(Vercel Postgres) | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
出身地照合用メンバー(Member、DB) |
Neon(Vercel Postgres)※出身地照合用 | v3.0.0 | ライブ・フェス機能 テーブル設計書 |
セットリスト(Setlist) |
Neon(Vercel Postgres)※将来拡張 | — | ライブ・フェス機能 テーブル設計書 |
フェス(Festival) |
Neon(Vercel Postgres) | v3.9.0 | ライブ・フェス機能 テーブル設計書 |
リリース(DB、Release) |
Neon(Vercel Postgres)※ Blob releases.json の移行先 | v4.1.0 | リリース データ設計書 §4 |
収録曲(DB、Track) |
Neon(Vercel Postgres)※ releases.json 内 tracks[] の移行先 | v4.1.0 | トラックリスト データ設計書 |
収録曲外部リンク(DB、TrackLink) |
Neon(Vercel Postgres)※ Track.links[] の正規化テーブル | v4.1.0 | トラックリスト データ設計書 |
Instagram投稿(InstagramPost) |
instagram/{memberId}/posts.json 内の値型 |
v3.5.0 | Instagram投稿機能 データ設計書 |
Instagram同期状態(InstagramSyncStatus) |
instagram/sync-status.json |
v3.5.0 | Instagram投稿機能 データ設計書 |
当日新着投稿(DailyNewPost) |
instagram/daily-new-posts.json 内の値型 |
v3.5.0 | Instagram投稿機能 データ設計書 |
TikTok投稿(TikTokPost) |
Neon(Vercel Postgres)※ v4.2.3までVercel Blob | v4.2.0 | TikTok投稿機能 データ設計書 |
TikTok同期状態(TikTokSyncStatus) |
Neon(Vercel Postgres)※ v4.2.3までVercel Blob | v4.2.0 | TikTok投稿機能 データ設計書 |
ラジオ番組(RadioShow) |
Neon(Vercel Postgres) | v4.3.0 | ラジオオンエア データ設計書 |
ラジオ放送回(RadioEpisode) |
Neon(Vercel Postgres) | v4.3.0 | ラジオオンエア データ設計書 |
ラジオ出演メンバー(RadioMember) |
Neon(Vercel Postgres) | v4.3.0 | ラジオオンエア データ設計書 |
ラジオオンエア楽曲(RadioOnairSong) |
Neon(Vercel Postgres) | v4.3.0 | ラジオオンエア データ設計書 |
統合イベント(Event) |
Neon(Vercel Postgres)※ Releases/Members/Lives/Radio/手動登録イベントの統合派生データ | v5.0.0 | イベントテーブル定義書 |
イベント楽曲(EventSong) |
Neon(Vercel Postgres)※将来拡張 | — | イベントテーブル定義書 §2a |
イベント楽曲・トラック紐付け(EventSongTrack) |
Neon(Vercel Postgres)※将来拡張 | — | イベントテーブル定義書 §2b |
YouTube投稿(YoutubePost) |
Neon(Vercel Postgres) | v6.5.0 | YouTube投稿一覧機能 データ設計書 |
メンバー関係性エッジ(MemberRelationship) |
Neon(Vercel Postgres) | v8.0.0 | メンバー関係性マップ データ設計書 |
メンバー関係性マップ座標(MemberMapLayout) |
Neon(Vercel Postgres) | v8.2.0 | メンバー関係性マップ データ設計書 |
Ameba同期状態(AmebaSyncStatus) |
ameba/sync-status.json |
v9.8.0 | Amebaブログ機能 データ設計書 |
公式TikTokアカウント(OfficialTikTokAccount) |
Vercel Blob(tiktok-official-accounts.json) |
v10.3.0 | TikTok投稿機能 データ設計書 §3 |
公式Instagramアカウント(OfficialInstagramAccount) |
Vercel Blob(instagram-official-accounts.json) |
v10.3.0 | Instagram投稿機能 データ設計書 §3 |
統合フィードアイテム(UnifiedFeedItem) |
実行時算出(永続ファイルなし。Ameba/Instagram/TikTok/YouTubeの既存データソースをRoute Handler内でマッピング) | v10.5.0 | 統合フィードアイテム データ設計書 |
ライブ・フェスフィードアイテム(LiveFeedItem・FestivalFeedItem・LiveEventFeedItem) |
実行時算出(永続ファイルなし。Neon(Vercel Postgres)の公演・フェス出演をRoute Handler内でマッピング。都道府県別公演画面のみが対象) | —※実装はMorningStatusApp#1636 | ライブ・フェス機能 テーブル設計書 §6 |
子供の生年データ(MemberChild) |
Neon(Vercel Postgres)member_children テーブル |
v10.6.0 | 世代マトリックス データ設計書 §2-1 |
4. データ取得層の設計方針(Server Component / BFF + TanStack Query の使い分け)
各ドメインのデータ取得層を、Server Componentでの直接取得のままとするか、Route Handler(BFF)+ TanStack Queryのクライアント側取得層に置き換えるかの判断基準。
適用基準
| 条件 | 実装 |
|---|---|
| 同じデータを複数の画面がクライアント側で必要としている(単一画面専用の取得ロジックではない) | Route Handler(BFF)+ TanStack Query |
| 複数の異なる形状のデータを1つの表示・型に統合する必要がある(判別共用体で表現するようなケース) | Route Handler(BFF)+ TanStack Query |
| どちらにも該当しない(単一画面が単一形状のデータを使うだけ) | その画面専用のServer Componentで直接取得 |
1・2番目の条件はいずれか一方を満たせばよい(両方を満たす必要はない)。3番目はどちらも満たさない場合のデフォルト。一貫性のためだけに全ドメインへ機械的に展開する基盤ではない。
2番目の条件の「統合」は、異なる形状の要素を1つの配列・判別共用体として扱う場合を指す。複数のデータを結合して集計値・派生データを算出するだけの場合(例: 平均年齢画面、世代マトリックス画面)は該当しない。
新しい機能・画面のデータ取得層を設計する際は、この基準で判定し、結果(適用しない場合も理由を添えて)を下記の実績ログに追記する。
具体的な実装パターン・適用判定の実績ログ
各ドメイン(SNS新着投稿・メンバー情報・ライブ/フェス情報・世代マトリックス 等)への適用判定ログは統合フィードアイテム データ設計書 §3、Route Handlerのキャッシュ戦略・TanStack Query導入手順・prefetch/hydrateの共通実装パターンは同設計書 §4に一元管理する。
ドメイン固有のスキーマ・エンドポイント設計(適用判定が「適用」となった場合の実装詳細)は、各ドメインの個別データ設計書に記載する(例: ライブ・フェス機能 テーブル設計書 §6)。
改訂履歴
| 版 | 更新日 | 変更内容 |
|---|---|---|
| 1.21 | 2026-09-29 | 【対応する実装: 実装時に追記(MorningStatusApp#1680)】プレイリストデータのBlob→Neon移行に伴い、「データファイル一覧」からplaylists.json・「派生データ」節(member-playlist-index.json・track-playlist-index.json)を削除。エンティティ一覧のプレイリスト(Playlist)・プレイリスト楽曲(PlaylistEntry)の格納場所をNeon(Vercel Postgres)に変更(MorningStatusApp#1677, morning-status-blume#166) |
| 1.20 | 2026-09-22 | 対比機能の再構築(Neon DB化)に伴い、「派生データ」節からcomparison-index.json・track-comparison-map.json(Vercel Blob)を削除。エンティティ一覧の対比ペア(ComparisonPair)・対比曲(ComparisonTrack)を対比グループ(ComparisonGroup)・対比グループ×トラック紐付け(ComparisonGroupTrack)に置き換え、格納場所をNeon(Vercel Postgres)に変更(MorningStatusApp#1633, morning-status-blume#148) |
| 1.19 | 2026-09-21 | エンティティ一覧の子供の生年データ(MemberChild)の追加バージョンを v10.6.0 とし、「設計のみ先行」の注記を削除(実装済のため。MorningStatusApp#1632、morning-status-blume#141) |
| 1.18 | 2026-09-20 | §4「データ取得層の設計方針」に、適用基準2番目の「統合」の範囲(異種要素を1つの配列・判別共用体として扱う場合。結合による集計・派生データの算出のみは該当しない)と、新機能の設計時に判定を実績ログへ追記する旨を追記。実績ログの参照先を、統合フィードアイテム データ設計書の章構成再編(適用判定ログ §3、共通実装パターン §4)に追随して更新。あわせて、エンティティ一覧の統合フィードアイテム(UnifiedFeedItem)の追加バージョンを、実装済の内容(v10.5.0)に更新(morning-status-blume#138、MorningStatusApp#1632) |
| 1.17 | 2026-09-20 | エンティティ一覧に子供の生年データ(MemberChild)を追加。世代マトリックス機能の設計書作成に伴う(morning-status-blume#128) |
| 1.16 | 2026-09-19 | §4「データ取得層の設計方針」を新設。Server Component / BFF+TanStack Queryの使い分け基準を全ドメイン共通の方針として明記し、統合フィードアイテム データ設計書 §6の適用判定ログを参照する構成にした。あわせてエンティティ一覧にライブ・フェスフィードアイテム(LiveFeedItem・FestivalFeedItem・LiveEventFeedItem)を追加(MorningStatusApp#1636) |
| 1.15 | 2026-09-17 | エンティティ一覧に統合フィードアイテム(UnifiedFeedItem)を追加。TanStack Query導入に伴うSNS新着投稿データ取得層の再設計(#90) |
| 1.14 | 2026-09-11 | 公式TikTok/Instagramアカウント一覧の管理方式をハードコード定数からVercel Blob(tiktok-official-accounts.json・instagram-official-accounts.json)に変更したことに伴い、データファイル一覧・エンティティ一覧に追加(#1487) |
| 1.13 | 2026-09-09 | イベントテーブル定義書へのリンクテキストをタイトル変更(「events テーブル定義書」→「イベントテーブル定義書」)に追随して更新(morning-status-blume#113レビューで検出) |
| 1.12 | 2026-08-30 | エンティティ一覧に EventSong・EventSongTrack(手動イベント登録の会場・楽曲属性追加、実装は将来拡張)を追加(MorningStatusApp #1528, morning-status-blume#67) |
| 1.11 | 2026-08-20 | ラジオオンエア データ設計書へのリンクテキストをタイトル変更(「ラジオオンエア収集 設計書」→「ラジオオンエア データ設計書」)に追随して更新(#1523) |
| 1.10 | 2026-08-06 | プライマリデータに radar-chart-timeline-config.json(レーダーチャート時系列表示の終端日設定)を追加。更新方法にAPIエンドポイントパス(/api/radar-chart-timeline-config)を明記(#34) |
| 1.9 | 2026-07-21 | メンバー・リリース データ設計書を新規作成し、エンティティ一覧の詳細設計書列(メンバー・リリース・メンバー・リリース紐付け・リリース(DB))にリンクを追加(#1379) |
| 1.8 | 2026-07-20 | Amebaブログ同期状態セクション・エンティティ(AmebaSyncStatus、ameba/sync-status.json)を追加(#1387) |
| 1.7 | 2026-07-19 | ラジオ・年表・YouTube・メンバー関係性マップのエンティティを追加。TikTokのデータファイル一覧セクションを削除しエンティティ一覧の格納場所をNeonに是正(実装は#888で移行済)。Amebaブログデータの格納先をmembers.jsonの概要に追記。エンティティ一覧の一部行に残っていた物理テーブル名(venues等)をPrismaモデル名に是正し、er-diagram.mdxにのみ存在していたフェス・リリース(DB)・収録曲(DB)・収録曲外部リンク(DB)の4行を追加(#1374) |
| 1.6 | 2026-05-15 | TikTok投稿データセクション・エンティティを追加(#887) |
| 1.5 | 2026-04-29 | 歌詞リンクデータセクションを追加(#745) |
| 1.4 | 2026-04-26 | Instagram投稿データセクション・エンティティを追加(#715) |
| 1.3 | 2026-04-11 | エンティティ一覧にライブ機能 Neon テーブルを追加(#528) |
| 1.2 | 2026-03-30 | データファイル・エンティティ一覧にユニット一覧機能(#531)の項目を追加(#532) |
| 1.1 | 2026-03-28 | 派生データ・エンティティ一覧に曲対比機能(#474)の項目を追加(#489) |
| 1.0 | 2026-03-21 | 初版作成 |