Upgrade to Pro — share decks privately, control downloads, hide ads and more …

まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話

 まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話

CodMon Tech Talk #7
https://codmon.connpass.com/event/405781/

コドモンのDB負荷対策チーム、こんなかんじでやってます!

長年運用されてきた巨大な汎用テーブルの解体、レスポンスの悪い機能の改善…「手をつけるべきだ」と分かっていつつも、影響範囲の広さやリスクの高さから、なかなか一歩を踏み出せずに悩んでいるチームも多いのではないでしょうか。

コドモンの汎用テーブル解体ではコードやテーブルを置き換えるだけでなく、PdMも交えてユースケースを洗い出し、必要なデータの単位を見極めたり、各所に散らばっていたデータアクセスをリポジトリ層に集約したりと、あるべき姿を目指して試行錯誤しながら進めています。

汎用テーブル解体も3周目。そのドメイン理解フェーズの事例をご紹介します。

テーブル解体の具体的な流れやつまづきポイントについては以下のブログやスライドをご参照ください。

・汎用テーブルの解体を安全に進めるために
・汎用テーブルがもたらす副作用とその対処
・システム成長を止めない!本番無停止テーブル移行の全貌

Avatar for さかうぇ

さかうぇ

October 26, 2026

More Decks by さかうぇ

Other Decks in Programming

Transcript

  1. 前提: テーブルの概要 • commentsテーブル 種別A. 職員の承認コメント 種別B. 保護者からの連絡 種別C. 連絡帳

    種別D. 健康チェック 種別E. 食事チェック 種別F. ...... 何でも入っている、まさに「汎用テーブル」 5
  2. 前提: テーブルの概要 • commentsテーブル 種別A. 職員の承認コメント 種別B. 保護者からの連絡 種別C. 連絡帳

    種別D. 健康チェック 種別E. 食事チェック 種別F. ...... 健康チェック・食事チェックを分離すれば 現行テーブルのデータ量は6割程度になる 6
  3. 前提: チームメンバーの理解度 • そこまで詳しくない… • • テックリード 2名 エンジニア 3名

    打刻や請求系、保護者アプリは詳しいが、 健康チェックと食事チェックはそれほど詳しくない… • わかっていたこと • • • 健康チェック:排便記録、検温記録、午睡記録 の3種類ある 食事チェック:給食やおやつをどのくらい食べたか記録する いずれも日ごと・園児ごとに記録される 7
  4. ◯:必要カラム △:判断できなかったカラム ✕:不要なカラム 前提: comments テーブルとは id PK PK PK

    PK PK 種別 健康チェック 食事チェック 連絡帳 保護者からの連絡 承認者コメント 紐づくID 子どもの ID 子どもの ID 子どものID 子どものID お知らせのID 日付 ◯ ◯ ◯ ◯ ◯ 本文(json形式) ◯ ◯ ◯ ◯ ◯ 公開ステータス △ △ ◯ ◯ ✕ 公開日時 △ △ ◯ ✕ ◯ 既読フラグ △ △ ◯ ✕ ✕ メールステータス △ △ ◯ ✕ ✕ 通知ステータス △ △ ◯ ✕ ✕ 画像パス △ △ ◯ ✕ ✕ 作成日時・更新日時 ◯ ◯ ◯ ◯ ◯ 削除フラグ △ △ ◯ ◯ ◯ 8
  5. テーブル定義を決めるために • 新テーブル定義の課題 • 必要なカラムに絞りたい → 不要な項目の判断が難しい 🤔 • 現行は重複データを許容

    → ユニーク制約を追加したい 🛡 • 食事チェックは給食・献立管理との連携がある → 給食管理がとにかく複雑で、コードから全てを把握するのは困難 • そもそも、健康チェック・食事チェックのドメイン理解が浅い? 10
  6. テーブル定義を決めるために • 新テーブル定義の課題 • 必要なカラムに絞りたい → 不要な項目の判断が難しい テーブル制約は • まず業務を知って

    ビジネスルールに → ユニーク制約を追加したい 現行は重複データを許容 • 食事チェックは給食・献立管理との連携がある 理解するべきでは? → 給食管理がとにかく複雑で、コードから全てを把握するのは困難 • action そもそも、健康チェック・食事チェックのドメイン理解が浅い? 直結するものである 必要な機能を プロダクトマネージャーを呼んで 健康チェック・食事チェックの ドメインモデリングをする 11
  7. ドメインモデリング: 健康チェックのわかったこと • 午睡チェックの重要性 • • • 乳幼児の午睡時間中の事故を防ぐのが目的 公的なガイドラインに5~10分ごとに1回、 子どもの様子を確認・記録する必要があると記載あり

    うつ伏せの場合は仰向けに直してそれも記録する ➡ 午睡の時間帯は頻繁に記録が行われる特性がある • 検温・排便記録の形式 • • 時間ごとの記録のみ、開所中は比較的満遍なく更新される 午睡データと同じカラムに JSON形式 で記録される 15
  8. ドメインモデリング: 食事チェックのわかったこと • 主に給食の喫食量を記録する機能 • • • 日中のおやつ の 食べた/食べなかった

    延長保育時の軽食 の 食べた/食べなかった ミルクの量 ➡ これも同じカラムに JSON形式 で保存される • 給食管理機能との連携 • 給食管理機能 から 写真などを 食事チェック に一括登録 • 献立更新時に 登録済みの食事チェックを上書き・リセットする ➡ 機能をまたいで食事チェックデータを更新される複雑さ 16
  9. 新テーブル定義 id PK PK 種別 健康チェック 食事チェック 関連種別 子ども 子ども

    関連種別ID 子どものID 子どものID 日付 ◯ ◯ 本文(json形式) json json 公開ステータス △ △ 公開日時 △ △ 既読フラグ △ △ メールステータス △ △ 通知ステータス △ △ 画像パス △ △ 作成日時・更新日時 ◯ ◯ 削除フラグ ◯ ◯ • 新テーブル定義 UK • • • • • id 子どものID 日付 本文(json形式) 作成・更新日時 19
  10. そして実装フェーズへ あれから半年… • 汎用APIから、健康チェック・食事チェックの 専用APIを切り出し • リポジトリをまたいで散らばっていた データアクセスを1箇所に集約 • フィーチャートグルを活用して

    小さくリリース ➡今週、現行テーブルの書き込み・参照共に完全に停止予定 👏👏👏 CoDMON Product Team Blog 「汎用テーブルの解体を安全に進めるために」 21