メインコンテンツへスキップ
友田 陽大

複数人同時編集のリアルタイム試合記録アプリ

アマチュア野球向け | React Native + Supabase | 600+ RLSポリシーの堅牢な権限設計を単独構築

クライアント

アマチュア野球向けの試合データ記録プラットフォーム(モバイルアプリ+運営ダッシュボード) | 開発体制: ドメイン設計〜実装・運用まで単独

私の役割

テクニカルアーキテクト 兼 フルスタック開発者(ドメイン設計・モバイルアプリ・運営ダッシュボード・DB/RLS・CI/CDまで単独で担当)

課題(Situation & Task)

試合中に複数のメンバーが同じ1試合を同時にスコアリングしても破綻しない、リアルタイム協調入力の仕組みが必要でした。さらに、選手・チーム・スカウト・運営という異なる立場ごとに、閲覧できる情報と操作できる機能を厳密に分離する必要がありました。

本アプリには、共同編集アプリ特有の難所が凝縮されていました。

  1. 同時編集の整合性: 1球ごとに高頻度で発生する入力を複数人が同時に行うため、重複・競合・順序の乱れを防ぐ必要がありました。

  2. 複雑な認可: 選手・スカウト・運営など立場が異なり、さらに「チーム単位の閲覧許可」「期限付きの記録権限」「スカウトへの項目別の開示制御」など、認可ルールが多層的でした。クライアントの出し分けに頼らず、サーバー側で強制する必要がありました。

  3. ドメインの正確性: 野球のスコアリングは状態遷移が複雑(アウト数・走者・イニング)で、不正な状態を構造的に防ぐ必要がありました。

技術選定の理由(Rationale)

  • Supabase (PostgreSQL + 行レベルセキュリティ): 認可をDBの行レベルで強制し、クライアントを信頼しないゼロトラストな権限設計を実現するため

  • モバイル(React Native/Expo) + 管理画面(Next.js) のモノレポ: ドメイン型(Zod)を単一の真実源として全スタックで共有し、スキーマ不整合を排除

  • TanStack Query + Realtime: 高頻度な入力は権限スコープ付きRPCのスナップショット取得、軽量な「更新通知」のみRealtimeで配信し、性能とコストを両立

実施したこと(Action)

  • 【同時編集の整合性】DB側に冪等性キーとチームスコープを実装し、複数人が同時に入力しても重複・競合を防止。アウト数や走者などの状態不変条件はCHECK制約で担保

  • 【ゼロトラスト権限設計】全テーブルに行レベルセキュリティを適用し、600超のポリシーで立場ごとのアクセスを厳密制御。機微な操作はMFAでゲートし、RPCはSECURITY DEFINERで監査

  • 【ドメインの正確性】野球の複雑なスコアリングルールを型・DB関数・制約で表現し、不正な状態遷移を構造的に排除

  • 【品質保証】1,200件超の自動テスト(アプリ+DBの行レベルセキュリティ テスト)と型カバレッジ96%超、CIでのスキーマ ドリフト検出を徹底

  • 【可観測性】Sentry連携とPIIスクラバ(個人情報のマスキング)で、機微情報を漏らさず本番の異常を検知

本プロダクトで最も難しかったのは、リアルタイム共同編集と多層的な認可の両立でした。

同時編集: 1球ごとの入力をRealtimeで直接購読すると負荷が高いため、軽量な「更新通知」だけをRealtimeで流し、実データは権限スコープ付きRPCのスナップショットとして取得・キャッシュする設計にしました。冪等性キーとCHECK制約により、複数人が同時入力しても整合性が保たれます。

認可: 認可はアプリ側の出し分けに頼らず、PostgreSQLの行レベルセキュリティで強制。立場・チーム・期限付き権限・項目別の開示まで、600超のポリシーで表現しました。行レベルセキュリティの変更には必ずpgTAPテストを伴うルールにし、退行を防いでいます。

技術選定の理由

  • Supabase 行レベルセキュリティ:認可をDB行レベルで強制(ゼロトラスト)

  • 冪等性キー+CHECK制約:リアルタイム同時編集の整合性

  • Zodドメイン型の単一真実源:モバイル・管理画面・DBで型を共有

  • pgTAP:認可ポリシーをテストで保証

担当領域

  • ドメイン設計・DB設計
  • モバイルアプリ開発(React Native/Expo)
  • 運営ダッシュボード開発(Next.js)
  • 認可設計(行レベルセキュリティ/MFA)
  • CI/CD・可観測性(Sentry)

使用技術

React Native
Expo
TypeScript
Next.js
Supabase
PostgreSQL
Row Level Security
Realtime
TanStack Query
Zod
Zustand
pgTAP
Jest
Sentry
Turborepo

数字で見る成果

RLSセキュリティポリシー
600+認可を行レベルで強制
自動テスト
1,200件+アプリ+DBの認可テスト
型カバレッジ
96%+TypeScript strict

成果

  • 複数人が同じ試合を同時にスコアリングできるリアルタイム協調入力を実現
  • 全テーブルに行レベルセキュリティを適用し、600超のポリシーで立場ごとの厳密な権限分離を構築
  • 1,200件超の自動テスト・型カバレッジ96%超で本番品質を担保
  • モバイルアプリと運営ダッシュボードを単独で設計・開発・運用

同様の課題、抱えていませんか?

あなたのビジネス課題も、最新の技術で解決できます。 まずは30分の無料技術相談から、状況をお聞かせください。

自社の課題もSaaS化できるか相談する

プロジェクト単位(請負)・技術顧問、どちらにも対応可能です

全ケーススタディを見る