SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

DB Magazine 転載記事

まったくの初心者もこれでバッチリ
12のキーワードから学ぶデータベース基本中のキホン(前編)

『DB Magazine 2007年05月号』 転載記事

keyword 5 正規化

 データベースに格納するデータは、適当な単位で適当に格納するわけにはいきません。きちんと設計して格納する必要があります。データがどのような「実体」を表わしているのかを洗い出し、いかに効率的に分類し集合化したら良いかを検討します。この作業を「正規化」と言います。

 正規化はデータベースにとっては大変重要な作業となります。正規化の作業を行なわないと、同じ実体を持つデータが複数の箇所に格納されるケースが発生します。そのような場合、データの修正時に修正漏れが生じ、データベースに格納されているデータに矛盾が発生する可能性があるのです。

 例えば、社員表と部署表があったとします。この社員表には社員情報が管理され、部署表には部署に関する情報が管理されています。もし、ここで部署名の「人事部」を「管理部」に変更すると、部署表の部署名を変更するだけでなく、社員表の部署名も関係ある場所はすべて変更しなければならなくなります。社員表に部署名がなかったとしたら、部署表の「人事部」を「管理部」に1箇所だけ変更すれば良いので、こういった問題はなくなるわけです(図10)。

図10:正規化と非正規化
図10:正規化と非正規化

 このように正規化を行ない、データを1箇所で管理することにより、修正漏れをなくすようにします。正規化は正規化の程度によって第1正規化から第5正規化までに分けられていますが、一般的には第3正規化まで行ないます。通常の作業においてほとんどの場合、第3正規化まで行なえば的確な正規化を表現できます。なお、正規化が行なわれていない状態を「非正規化」と呼んでいます。

 正規化の作業を行なう場合には、行を何で識別するのかということを必ず考えます。この識別するものを「主キー」と言い、表の特定の列に設定します。例えば、先ほどの社員表で言うと、社員を識別するものとして社員番号を主キーと想定します。社員を識別する場合には氏名で行なうと考えがちですが、同姓同名の人が社員にいることも想定されます。そのため氏名は識別するものとはなり得ません。つまり主キーには必ず値が必要で、かつ値が重複していてはならないというルールになります。

 第1正規化から第3正規化を簡単にまとめると表2のようになります。

表2:第1正規化~第3正規化
正規化 正規化した結果 具体的に行なうこと
第1正規化 データ内に繰り返される部分がない 繰り返される部分を別の行にするか、別の表として分割する
第2正規化 同一行内で主キーが決まればほかの列の値も一意に決まる 一意に決定できない部分は別の表として分割する
第3正規化 主キー以外の列において、それぞれが従属関係(列の値同士の関係)を持っていない 従属関係を持つ部分を別の表として分割する

 なお、正規化を進めるとデータ検索の効率が悪くなります。例えば社員表から部署名を取り除くと、その社員がどの部署に所属しているかを具体的に調べるためには、社員表を検索した後に部署表を続けて検索する必要があり、検索時間が長くなります。そのため、検索時間の短縮のために社員表に部署名を残しておく場合があります。これが正規化をしない非正規化の代表例です。非正規化をした場合、データベースのデータの修正漏れが発生する可能性が残るので、アプリケーションなどでこれを防ぐためのロジックを検討し、付け加える手間が生じます。

次のページ
keyword 6 制約(整合性制約)

この記事は参考になりましたか?

DB Magazine 転載記事連載記事一覧
この記事の著者

市川 道雄(イチカワ ミチオ)

 株式会社日立システムアンドサービス、人財教育部に勤務。サポート/ソリューションサービス部門と連携した教育企画/実施を担当後、現在はOracleを含むデータベース関連教育を選任で担当している。Oracle認定講師。データベーススペシャリスト、ORACLE MASTER Gold Oracle Databas...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3261 2009/02/05 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー