データベース設計について


書籍でデータベース設計について学習したのでまとめてみたいと思います。
本当に基礎中の基礎のことしかまとめないので、何の参考にもならないと思いますが、自分の頭を整理するために。。

データベース設計の3つの手順

データベースやテーブルの設計は以下3つの手順を経て行います。

概念設計

管理すべき情報はどうのようなものかを整理する。システムに関する事は考えず、要件に登場する情報だけを把握する。
情報間で関連がある場合(リレーション)、どのような関係があるかも整理する。ER図もこの段階で作成する
概念設計では、情報を整理するために以下の3つの言葉が使用される

  • エンティティ...テーブルのようなもの
  • 属性...テーブルの列のようなもの
  • 関連...リレーションのようなもの

エンティティを導き出す方法

  • 候補となる用語を洗い出す
  • 不要な用語を捨てる
  • 関連がありそうなものをまとめる
  • エンティティ名と属性名に分ける

論理設計

概念設計で整理された各情報について、RDBを使う前提で構造を整理し具体化していく。
論理設計では、どのようなテーブルを作り、それぞれどのような列を作るかまで明らかにすれば良い。
データ型や制約などの部分については考えない。
論理設計では正規化という作業を中心に行っていく。
正規化は矛盾したデータを格納できないよう、テーブルを複数に分割していく作業のこと。
正規化によってテーブルが適切に分割された状態を正規形といい、正規形は非正規形から第5正規形まであるが、システム開発の場合は、第3正規形までで問題ない

第1正規形

テーブルのすべての行のすべての列に1つずつ値が入っている状態。
繰り返し列やセルの結合が現れてはならない。

  • 繰り返しの列の部分を別の表に切り出す
  • 切り出したテーブルの仮の主キーを決定する
  • 主キー列をコピーして復号主キーを構成する

第2正規形

複合主キーを持つテーブルの場合、非キー列は、複合主キー全体の関数従属すべき。
複合主キーの一部の列に対してのみ関数従属する列が含まれてはならない

  • 複合主キーの一部に関数従属する列を切り出す
  • 部分関数従属先だった列をコピーする。

第3正規形

テーブルの非キー列は主キー列に直接、関数従属するべきである。
主キーに関数従属する列にさらに関数従属する列は存在してはならない。
このような関係を推移関数従属という。

  • 関節的に主キーを関数従属する列を切り出す
  • 直接関数従属だった列をコピーする

3つの正規化で排除するもの
第1正規形への変形...繰り返し列
第2正規形への変形...複合主キーへの関数従属(部分関数従属)
第3正規形への変形...間接的な関数従属(推移関数従属)

物理設計

特定のDBMS(MySQL、PostgreSQLなど)を使う前提に立ち、論理設計で明らかになった各テーブルについて、その内容を詳しく具体化していく。
データベース設計の最終段階なので、型、インデックス、制約、デフォルト値など、テーブル作成に必要な要素を確定させる。
物理設計に基づいて、CRRATE TABLEなど、一連のDDL文を作成し、データベースを作成していくことになる。

物理設計に必要な手順

  • 最終的なテーブル名、列名を決定する
  • 列の型を決定する
  • 制約、デフォルト値を決定する
  • インデックスを決定する

データベースの設計についてまとめてみました。
エンジニアなら誰でも知っていることだと思いますが、改めて書籍で学習すると、知識が定着したような気がします。