Pythonとサラリーマンと

2020年6月にPythonを始めたサラリーマンのブログです。

『達人に学ぶDB設計 徹底指南書』を書き留める

学べること

  • データベースとは
  • データベースを設計する上で考慮に入れるべきこと

業務システム、Webサービス
こういったシステムを構築する際に必要になるのがデータベース。
いざデータベースを作ろうとしたときに、必ず陥るのが
「データをどのように整理すれば良いのか分からない」
という状況。
そんな状況を打開するために考えるべきポイントをまとめたのが、こちらの本。
以下に印象に残ったことを書き留める。

論理設計のステップ

  1. エンティティの抽出
  2. エンティティの定義
  3. 正規化
  4. ER図の作成

エンティティとは、データの集合体。
例えば「顧客」や「社員」「店舗」「車」といったもの。
エンティティ毎に一つのテーブルを作成する。

取り扱いたいエンティティを抽出したら、そのエンティティがどのような値(attribute)を持っているのかを定義する。
顧客であれば、"名前""住所""年齢""性別"といった属性を定義することができる。
この値一つ一つがテーブルの列を構成する。

それぞれのエンティティ(テーブル)を最適化する作業を正規化と言う。
正規化ステップが用意されているので、これに従って正規化を行う。

正規化したテーブルはER図によって、それぞれの関係性を図解する。
これによってデータベース内のテーブルの関係性を把握することができる。

バックアップ

データベースにはバックアップが不可欠。
データベースに異常が生じた場合にはバックアップから回復する。 フルバックアップ/差分バックアップ増分バックアップがある。 フルバックアップはバックアップ時間が長いが、復旧が簡単。 差分バックアップはバックアップ時間を短縮できるが、復旧の手間が発生する。
増分バックアップはバックアップ時間がもっとも短いが、復旧の手間がもっとも大きい。
DBMSの種類毎にバックアップ方法の呼び方が異なるので注意。

障害発生→リストア→リカバリ→ロールフォワード。

テーブル

列(カラム)/行(レコード)。
テーブルには必ず主キーが存在する。主キーはテーブルの中で一意でなければならない。 主キーを指定すれば、必ず1行のレコードを特定することができる。
テーブルには重複したレコードは存在できない。 外部キーを用いることで2つのテーブルを紐づけることができる。
テーブルにはNOT NULL制約/一意制約/CHECK制約といった制約を持たせることができる。

正規化

  • 第1正規形〜スカラ値の原則
    1つのセルの中には1個のデータしか入ってはいけない。

  • 第2正規形〜部分関数従属
    部分関数従属している値があれば、それは独立させて別のテーブルを作る。

  • 第3正規形〜推移的関数従属
    推移的関数従属している値があれば、それは独立させて別のテーブルを作る。

インデックス設計

DBMSにはインデックス機能が備わっている。 インデックスを作成してもアプリケーション/テーブルのデータのいずれにも影響を与えない。
それにも関わらず、検索スピードをUPさせることができる。
インデックスは、大規模なテーブルに対して、カーディナリティの高い列に作成すると良い。
ただ、カーディナリティが高くても、その列をキーに検索することがなければインデックスを作成しても意味をなさない。

以上

Amazon CAPTCHA