令和の今、あえてマスタテーブル VS ハードコーディングについて考えてみた
この記事の目的
今更「現代のプログラミングでマスタテーブル(特に更新が想定されないもの)使う意味ってなんだ? デプロイすぐ終わるしハードコーディングでよくないか?」と、ふと疑問に思ったので、メリデメについて言語化してみようともった。
「マスタテーブルとハードコーディングについて説明した上でメリット・デメリットを教えてください」とChatGPTに聞いてみたところ、
ところどころ怪しい(ex データの再利用性/依存関係の増加あたりは「実装次第ちゃう?」という感じ)返事が返ってきた。
ちょくちょく引用しつつ、自分なりに考えを整理してみることにした。
前提: 言葉の定義について
マスタテーブルとは
アプリケーション内で使用される標準的なデータのセットを格納するためのデータベーステーブルのこと
※ テーブルイメージ
id | name |
---|---|
1 | 小学生 |
2 | 中学生 |
3 | 高校生 |
4 | 大学生 |
5 | 社会人 |
なお、今回の「マスタテーブル」は、「変更頻度がデプロイ頻度よりはるかに低く、管理画面などで変更されることがないもの」という前提で話を進める。
(管理画面などから値を変更することが可能なタイプのマスタテーブルの場合、そもそもハードコーディングは比較する対象にならないため)
ハードコーディングとは
プログラム内(or プログラムにバンドルされたjsonファイルなど)に固定の値やデータを直接記述すること
[
{
"id": 1,
"name": "小学生",
},
{
"id": 2,
"name": "中学生",
},
{
"id": 3,
"name": "高校生",
},
{
"id": 4,
"name": "大学生",
},
{
"id": 5,
"name": "社会人",
}
]
メリット比較
マスタテーブルはデプロイなしで値を修正できる
まずこれ。主に工数の文脈だ。
「データベースの値を変更する工数」と「ハードコーディングされた値を変更する工数」を比較して、前者が圧倒的に安く上がる場合は確かにマスタテーブルのメリットと言える。
しかし、これはCI/CD環境のきちんとしたモダンな開発環境では恩恵がそこまで大きくないと考えられる。
そもそもデータであろうとコードであろうと「アプリケーションの挙動に関わる値を変更する」という結果に変わりは無い。
「デプロイより、データベースの値を直接変更する工数の方が安い」という状態は、運用に改善の余地があるケースが多いと思う。
(ex 「コードレビューやテストのルールなどが不必要に保守的」「データベースの値を変更するためのオペレーションのルールが緩すぎる」など)
とはいえ運用ルールは大体の場合改善の余地があるまま運用されるので、このメリットが大きいシステムも世の中にはたくさんあると思う。
人生そんなもんです。
マスタテーブルがあれば、SQLでマスタデータを結合したデータを出力できる
マスタテーブルが持っている値はSQLで結合して取得できるため、分析ツールなどで「使いやすいデータ」を作ることが容易である。
あるべき論でいえば 事業のドメインに関する値はアプリケーションレイヤで握っておくべき なので、本来は そもそもアプリケーションのDBをSQLで直接集計をするな と言う話ではある。
夜間バッチなどで、アプリケーションレイヤの知識を含めた分析用のデータが入ったデータレイクを作るのが良いはずだ。(この辺詳しく無いのでツッコミお待ちしてます)
しかし、そういった「強い分析基盤」は、それ自体の運用やメンテナンスに高いコストがかかる。
そのため、そう言ったものの無いシード ~ ミドルフェイズのベンチャーでは、このメリット捨ておけないことも多そうだ。
ハードコーディングであれば、環境ごとのデータを制御しやすい
特にドメインの根幹に関わる値の場合、「本番環境でしか存在しないデータ」の発生を抑制できるのは結構大きなメリットだと思う。
本番環境をマスクしたテストデータを作る仕組みなどがあれば良いが、そういった仕組みがない(あるいは運用ができない)会社もたくさんあるだろう。エンジニアの認知負荷軽減として馬鹿にならないメリットになることもありそうだ。
ハードコーディングはパフォーマンスが良い
ハードコーディングであれば、DBをアプリケーションから呼び出すアクセス時間分処理を軽くすることができる。
しかし、これは一番最後、あるいは問題が起こってから考えるべきことで、大体のケースではこれを理由にするのは間違っていると考える。ボトルネックを特定する前の早すぎる最適化は諸悪の根源である。
(そもそも、ハードコーディングの方が絶対に早いとは言い切れない。マスタの量が膨大な場合などのエッジケースも存在する。)
まとめ
私のスタンスとしては「原則ハードコーディングでやった方が良さそうというスタンスを取りつつ、マスタテーブルのメリットが大きい時はそちらを検討する」という感じになりました。
~つまり何事もバランスが大事ってことですね。~
![マナリンク Tech Blog](https://storage.googleapis.com/zenn-user-upload/avatar/aff9b0fef2.jpeg)
オンライン家庭教師マナリンクを運営するスタートアップNoSchoolのテックブログです。 manalink.jp/ 創業以来年次200%前後で売上成長しつつ、技術面・組織面での課題に日々向き合っています。 カジュアル面談はこちら! forms.gle/fGAk3vDqKv4Dg2MN7
Discussion