/note/tech

変化に強いテーブル設計の勘所

要約:

■ 1. 発表の前提と問題意識

  • 時代は大AI(Agent)時代であり、テーブル設計もAIに代替されるかという問いがある
  • 結論として、テーブル設計はAIに代替されない
  • AIは労力を代替できるが、能力(設計力)は代替できない(@t_wada)
  • AIは設計のサポートをしてくれるが、設計の判断は人間が行うしかない
  • データベースの寿命はアプリケーションよりも長く、だからこそデータベース設計が重要

■ 2. データベースが変化に弱い理由

  • 変化に弱い根本的な原因:
    • DELETEやUPDATEによりcommitされたデータは元に戻せない
    • カラム追加時には過去データへの対応が必要
    • INSERTなど前後のアプリケーションとの互換性を考慮する必要がある
    • 一度作ったテーブルやデータを削除して良いか判断が難しい
  • サービスが成長するにつれ自然とデータベースも肥大化する
  • 肥大化の結果として生じる問題:
    • 本番環境へのALTER実行でロックが発生しサービスが停止する
    • 特定カラムを確認するif文の列挙が複雑化する
    • SELECTするまで結果がわからない
    • テーブルの変更が怖くなる
  • ビジネスは常に変化するため仕様変更は必然的に発生し続ける

■ 3. 設計上の問題の具体例: usersテーブルへのLINE認証追加

  • 初期のusersテーブル構成: name、birthday、email、hashed_password
  • LINE認証を追加する場合の問題:
    • usersテーブルにカラム追加する場合:
      • emailとpasswordが必須のため、LINE認証で登録してもemailとpasswordの入力が必要
      • ユーザの手間が減らず、むしろ増える
    • LINE認証情報を別テーブルにした場合も同じ問題が生じる:
      • emailとpasswordをNULL許可にする必要がある
      • NULLを許可するとemailのUNIQUE制約が機能しなくなる
  • 機能開発のためのテーブル変更がビジネス側に不要な制約を生み出す
  • 仕様追加が積み重なると、将来を見据えたテーブルの修正なしには次の仕様追加に耐えられなくなる
  • 対応策の方針:
    • データベースに状態を持たせない
    • データベースには事実のみを保存する
    • ビジネスロジックはアプリケーション側で担保する

■ 4. 正規化とSimple is Beautiful

  • 正規化の基本方針:
    • 事実だけを保存する
    • 重複がない
    • 不整合がない
    • NULLがない
  • 情報と事実(データ)は異なる:
    • 生年月日は事実
    • 年齢はそのタイミングの情報(派生値)
  • 正規化はUnixの哲学とも通じる:
    • Small is beautiful(小さいものは美しい)
    • Make each program do one thing well(1つのプログラムには1つのことをうまくやらせる)
  • テーブル設計への応用:
    • 1テーブル、1責務を原則とする
    • SimpleとEasyは異なる概念であり、Simpleを目指す
    • SimpleとEasyは両立可能であり、質とスピードも両立できる
  • usersテーブル分割の実例:
    • emailは認証情報以外の属性も持つため(複数emailを持つ可能性など)、passwordと別テーブルに分ける
    • 分割後の構成: users、user_email、user_personal_information、user_login_hashed_password
    • この設計によりuser_login_lineテーブルを追加するだけで新たなログイン方式に対応できる
  • イミュータブルデータモデリングを活用してUPDATE操作を減らす
  • テーブルがSimpleであるほど変化に強くなる

■ 5. AIとの設計の歩み方

  • AIにテーブル設計を一任することは上手くいかない
  • LLMの特性と限界:
    • LLMは単語に対してありそうな文言を回答するが、設計の背景を知らない
    • それっぽいテーブルは生成できるが、良くある駄目なパターンを回答しやすい
    • 世の中のOSSには EasyでDirtyな設計が多く(例: WordPressやRedmineのEAV)、それらを学習している
  • 機能単位などの大きな単位でAIに任せるのはプロトタイプ以外では悪手
  • AIの学習モードの限界:
    • AIはシングルループ学習(実行結果をもとに行動を変える)にとどまる
    • 人間が行うダブルループ学習(結果から前提を見直して根本から変更する)はできない
    • 要求は物理世界にあり、前提の見直しと要求変更は人間の仕事(しばらくは)
  • AIの適切な活用方法:
    • データモデリング自体は人間が行い、サポートとしてAIを活用する
    • MarkdownからER図やDDLを生成させる
    • DDLからテストデータを生成させる
    • DDLから想定するユースケースを洗い出し、ユースケース別のSELECTクエリを生成させる
    • PKの設定漏れやカラム名のタイポなどをレビューさせる
    • JSONやCSVから必要なエンティティを取り出す

■ 6. おわりに

  • 今こだわり抜いた設計が未来の自分を救う
  • 仕様を満たすコードではなく、要求を満たすコードを書くことが重要
  • 要件に合わせて設計するのではなく、要求に合わせて要件を整理することが重要
  • データモデリングのスキルは寿命が長く、複利で効く能力
  • データベース設計はしばらくAIに代替できる仕事ではなく、AIには労力のサポートをさせる位置づけが適切
  • データベースのリファクタリングで最大の鬼門は仕様であり、ビジネス理解と調整が最も効果的
  • 推薦書籍:
    • 「SQL実践入門」(ミック著): SQLの基礎本
    • 「達人に学ぶDB設計 徹底指南書」(ミック著): DB設計の基礎本
    • 「SQLアンチパターン 第2版」(Bill Karwin著、t_wada監訳): 重要なアンチパターンを網羅
    • 「失敗から学ぶRDBの正しい歩き方」(曽根 壮大著): PostgreSQL & MySQL対応
  • データモデリングはスキルであるため、正しく学べば身につけることができる
  • Simple is Beautiful: 常に追求した者だけが辿り着ける境地