書籍タイトル:達人に学ぶDB設計徹底指南書
読む時間:07:05
はじめに
先月、以下のテキストを読んで新卒研修レベルのデータベースに関する知識を復習しました。ただ、それだけでは不十分だと感じたため、同じ著者であるミックさんの中級者向けテキストも購入し、より深くDB設計に関する知識を学ぼうと思いました。
ちなみに本書については、以下のブログに非常に詳しいメモがまとめられており、とても参考になったのでおすすめです!
(時間があれば、テキスト本体を読むことをさらにおすすめしますが)
📚 本書の詳細情報
印象に残ったポイント
1. DOA vs POA
テキストの第1章では、データベース設計時のアプローチとして、以下の方法が紹介されていました。
・DOA(データ中心アプローチ):プログラムよりも先にデータの設計から始め、正規化のルールに沿って適切にテーブルを分割する方法。
・POA(プロセス中心アプローチ):処理・プロセス・画面操作など、プログラムの実装しやすさを重視してデータの設計を行う方法。
まさに今、お客様案件でこれらのアプローチについて非常に悩みました。
お客様の画面上に表示するデータは、複数次元の配列や深いツリー構造の入力が必要で、さらにそれらのデータに対して細かいバックエンドでのチェック処理も求められました。
DBエンジニア(あるいはバックエンドエンジニア)視点では、DOAを採用して正規化をきちんと行いたいところですが、実際の現場ではプログラムの検討が先に進んでいたり、データ設計と同時並行で進んでいたりするケースが多くあります。
特に今回のような複雑なデータ構造の場合、第三正規化まで行うと、フロントエンドからは非常に複雑なクエリが必要になり、逆にフロントエンジニアから不満が出る可能性もあります(笑)
最終的には、正規化の粒度についてフロント側と相談しながら、複雑すぎる二次元・三次元の配列は、JSON形式で直接保持する形に落ち着きました。
2. 正規化はどこまでやるか
このテキストの著者によると、少なくとも第三正規形(3NF)まで行えば十分であり、第四・第五正規形については案件ごとに検討すればよい、とのことでした。
ただ、上記のうちの案件のように、JSON形式で複雑なツリー構造をそのまま保持するような設計だと、第一正規形の定義である「1つのセルには1つの値のみを含めるべき」という原則すら満たしていない気がします
。
とはいえ、これが必ずしも「悪い設計」だとは思っていません。むしろ、最近のDB製品ではJSON形式をサポートするものが増えてきており、柔軟な設計が可能になっていると感じます。
実際、私の前の案件やその前の案件でも、似たような設計が採用されていました。論理的にベストプラクティスとされる設計は存在するとは思いますが、現場では結局のところ、各ステークホルダーの意見や事情を踏まえて、最適な落とし所を見つける形になるのだと実感しました。
3. B-treeなど、データ構造をある程度知ったほうがいい
一般ユーザーにとっては、画面上でデータを入力して「送信」ボタンを押せば、それで完了です。
Webエンジニアにとっても、フロントエンドやバックエンドの処理を通じて、データベースに対してCRUD(Create・Read・Update・Delete)操作を行えば、ひととおりの作業は終わります。
でも、データベースを管理・設計するエンジニアの立場になると、「データをDBに入れたあと、内部で何が起こっているのか」まで知っておくことの重要性を強く感じます。
例えば、画面上ではあたかも二次元の表(テーブル)にデータを入力しているように見えますが、実際にハードディスクにそのまま保存されているわけではありません。
また、データを取得する際も、単純に「その行を探して取ってくる」ような動作ではなく、B-tree(B木)などのデータ構造やアルゴリズムが裏側で動いています。
こうした内部構造や設計思想を理解しているかどうかで、データベースのパフォーマンス設計やチューニングの精度は大きく変わってきます。
「ただ動けばいい」だけではなく、「なぜそのように動いているのか」「その裏では何が行われているのか」まで掘り下げていくことで、より深い知識と実践的なスキルが身につくのだと改めて実感しました。
まとめ・感想
本書では、より実践的で幅広い知識を学ぶことができました。
4月から新しい案件に入り、一人でバックエンドを担当することになったうえ、データベース設計まで任されることになり、正直かなりのストレスを感じていました。
そんな中で本書を読んだことで、気持ちが少し落ち着き、テキストで学んだ知識を「武器」として実際の案件に活かすことができたのは本当に良かったです。
実際のDB設計では、考慮すべき点が非常に多く、「これが正解!」という唯一の答えは存在しないと思います。
それでも、できる限りプロジェクトの要件や現場の状況に応じた最適な設計を導けるよう、これからも知識を深めていきたいと感じました。