8tako8tako8’s blog

ソフトウェアエンジニア

【感想】「達人に学ぶDB設計 徹底指南書」を読んで

概要

普段の業務でデータベース設計を行っているので基本的なことはわかっているつもりですが、知識の再確認のため、データベース設計の入門書で有名な「達人に学ぶDB設計 徹底指南書」を読んだ感想です。

良かったところ

  • 複雑なデータベース設計の概念をわかりやすい説明がされており、初心者でも理解しやすい内容となっていること
  • 正規化等のデータベース設計のベストプラクティスを学ぶことができたこと
  • 当たり前のようにやっている正規化について、その名前(第o正規形など)を知ることができたこと

悪かったところ

主キーに「可能な限り自然キーを使う」

主キーに「可能な限り自然キーを使う」という点が引っかかり、「それは状況によるのでは?」と思いました。

主キーに自然キーを採用するデメリットとして、自然キーが変更されると、それに連動して他の関連テーブルも更新する必要があります。

一方、代理キーでは、自然キーと比べ変更される心配がほぼないので、他のテーブルへの影響が少なくてすみます。

絶対に変更されない自然キーなら問題ないかもしれませんが、そうとは言えない自然キーの方が多いかと思うので、代理キーを使うのが無難だと思います。

学んだこと

インデックスが効かないケース

インデックス列に演算を行っている

select *
from users
where point * 10 > 100;

インデックス列にSQL関数を適用している

select *
from users
where substr(name, 1, 1) = 'A';

is nullを使っている

select *
from users
where name is null;

否定形を使っている

select *
from users
where name <> 'tako8tako8';

orを使っている

この場合、インデックスを効かせるためには、in()を使うようにしましょう

select *
from users
where name = 'tako8tako8' or name = '8tako8tako8';

インデックスのデメリット

書き込み性能の低下

データの挿入、更新、削除の際にインデックスも同時に更新する必要があり、書き込み操作のパフォーマンスが低下する可能性がある。

定期的なメンテナンスが必要

テーブルのデータが更新されていくと、長期的には構造が崩れて性能が劣化していくため、インデックスの貼り直しをする等の定期的なメンテナンスが必要になる。

ストレージ容量の増加

インデックスを作成することで、データベースが消費する容量を増加させるため、インデックスの貼りすぎには注意する。

難しかったこと(今後の課題)

本書ではあまり触れられていないが、パフォーマンスチューニングについては、あまり経験(実行計画を見てインデックスを貼り直す程度)がないので、より良いインデックスの貼り方や効率の良いクエリを書けるようになることを今後の課題にしたい。

まとめ

ある程度業務でデータベース設計をやっている人でも学びがある良書でした。特に、インデックスまわりの知識はデータベースを深く知る上で重要となる知識であるため今後も学習していきたい。