📝

外部APIの値をDBにフラグとして持ち込まないこと

に公開

それでもAIが答えてくれないこと #4


導入

自分は「未来のエンジニアを困らせる負債を増やさない」ことを信条にしている。

今回のケースは、外部SaaS APIと自前DBの二重管理が招いた不整合にどう向き合うか、という判断だった。


事例

あるテーブルに is_xxxx というカラムが追加された。

  • テーブル自体は3年前から存在
  • is_xxxx は半年前に ALTER TABLE で追加
  • バッチ処理で外部SaaS APIを叩き、レスポンスの値(true/false)を格納

一見便利そうに見えるが、実際にはこうだった:

  • 外部APIはテーブルの全レコードを網羅していない
  • is_xxxxの仕組み変更前の古いデータは未対応
  • そのため、半年前以前のデータはすべて false 固定

つまり、このカラムは「古いデータ=false」という誤った状態を内包していた。


なぜ問題か?

外部APIのレスポンスと is_xxxx の値は整合していない。

それにもかかわらず、エンジニアはDBのカラムを見て実装してしまう。

  • 不整合に気づかずバグを埋め込む
  • 原因究明に余計な時間を費やす
  • バッチ処理やカラムの存在意義を説明するコストが発生する

これはまさに 二重管理の弊害 であり、未来のエンジニアに負担を押しつける構造だった。


自分の判断

is_xxxx カラムを廃止することだった。

source of truth を間違えたくなかったからだ。

  • フラグをDBに持ち込まず、毎回外部APIを叩く
  • レスポンスそのものを唯一のtruthとする
  • バッチ処理は廃止する

幸い、この外部SaaS APIはレート制限が緩く、料金はバッチ処理を稼働するよりもかなり安く、十分なレスポンス速度があった。

だからこそ「毎回APIを叩く」判断に現実味があった。


未来

is_xxxx カラムを削除すれば、バッチ処理は不要になる。

説明コストもなくなり、不整合に悩まされることもない。

エンジニアはAPIのレスポンスだけに注目すればよくなる。

つまり、責任は外部API側に委ね、私たちはその結果に集中できる状態になる。


学び

  • 外部APIが十分に使えるなら、DBにコピーを持ち込むべきではない
  • 二重管理は「安心感」ではなく「負債」を生む
  • 判断の本質は「廃止する」にある

まとめ

技術的には、外部APIの値をDBに同期することは簡単だ。

しかし、その実装が未来のエンジニアを混乱させ、不整合や説明コストを増やすなら、やらない方がいい。

外部APIをsource of truthにし、is_xxxx カラムを廃止する判断こそ、AIが答えられない部分であり、記事に残す意味がある。

Discussion