\documentclass[a4j]{jarticle} \usepackage{graphicx} \title{データベース設計と正規化} \date{\today} \author{森田 亙昭} \begin{document} \maketitle \section{データベース設計} データベースを設計を行う際には、作成しようとしているデータベースの 一貫性を保つことが重要になります。\\ データベースに一貫性があるとは、トランザクション 実行の前後でデータベース内の相互に関連する部分の間で矛盾がないことを意味します。\\ 例えばある商品に関する、「在庫数」と「出荷した数」と いう項目を持つテーブルがあるとします。このテーブルに対し、「出荷」とい う操作を行ったとき、この操作の終了時点で「出荷した数を増やす」という操 作と「在庫数を減らす」という2つが両方とも行われてはじめてデータベー スの一貫性が保たれます。もし、片方だけ(出荷数の増加)をおこなうと。過剰 在庫のような状態に陥ってしまい、このデータベースは一貫性を失います。 \section{主キー} データベースの設計を行うときには、テーブルごとの主キーを決定する必要があります。 主キーとは、テーブル内の行を一意に識別するために使われる項目のことで、テー ブル内のデータを効率よく検索したり並べ替えたりするために使用されます。\\ 主キーは、そのテーブルの全てのレコードでユニークでなければなりません。つ まり、同じテーブル中に同じ値が存在してはいけません。\\ たとえば、学生を管理 するデータベースにおいて、学籍番号は主キーとなることができますが。学生の 名前はかなりの低確率とはいえ同じ学部内 に同姓同名の人がいる可能性が考えられますので、主キーとして使うことはでき ません。\\ また、主キーには、必ず空値以外の何らかの値が入っていなければいけません。 学籍番号のない学生は登録できないというわけです。\\ \section{正規化}  正規化とはデータ構造についてデータの冗長性を少なくし、かつ更新不整合が起こらないようにしていくことでデータベースの一貫性を保つ作業の ことです。 \\ 正規化には第1正規形、第2正規形、第3正規形、ボイスコッド正規形、第4正 規形、第5正規形の六つの種類があり、それぞれの正規形は前者を包含する関係 になっています。 それぞれの定義については、以下のようになっています。 \begin{itemize} \item 第一正規形$\cdots$ テーブル内に属性の値として繰り返しなどの集合や複合値を持たないもの \item 第二正規形$\cdots$ テーブルが第1正規形であり、かつすべての非キー属性が主キーに対して完全 関数従属であるもの \item 第三正規形$\cdots$ テーブルが第2正規形であり、かつすべての非キー属性が推移的に関数従属で ないもの \item ボイスコッド正規形$\cdots$ 他の属性がある属性(X)に完全関数従属であり、かつ属性(X)が候 補キーであるもの \item 第四正規形$\cdots$ ボイスコッド正規形のテーブルで、すべての適切な多値従属性がキーによるものであるもの \item 第五正規形$\cdots$ 分解によって得られるテーブルが結合によって、もとのテーブルに戻ることが 可能であることを結合従属性といい、あるテーブルがその候補キー内で結合従 属性が満足されているもの \end{itemize} \subsection{第一正規形}  第一正規形とは、テーブルにおいて属性の値として繰り返しなどの集合や複合 値を持たないものをいい、この条件を満たさないものは非第一正規形と呼ばれま す。\\ 図\ref{1seiki}に示すテーブルは、非第一正規形です。\\ \begin{figure}[h] \begin{center} \includegraphics {1seiki.eps}\\ \caption{非第一正規形} \label{1seiki} \end{center} \end{figure} このテーブルには繰り返し項目が含まれているため、例えば「stereoを買った客は誰か」というような問い合わせを処理することができません。 そこで、第一正規化では繰り返し項目を元の表から分離し、独立した行 として存在するような新たな表を作成します。\\ 第一正規化されたテーブルは、図\ref{1seiki2}のようになります\\ \begin{figure}[h] \begin{center} \includegraphics {1seiki2.eps} \caption{第一正規形} \label{1seiki2} \end{center} \end{figure} この新たなテーブルにおいて、伝票番号と商品コードの組合わせはテーブル全体 で重複していな いので、主キーを構成する列は、「伝票番号」、「商品コード」の2つになりま す。 これで、正規化前は不可能だった問い合わせ処理が可能になりましたが、それで もまだ幾つかの問題が残っています。 たとえば、この図\ref{1seiki2}において、伝票番号0002である伝票の受注日に間 違えがあったとすると、その訂正をするのに、この図では二個所のデータを修正 しなくては行けません。もし修正をを間違えようものなら、 受注日の異なる2つの伝票0002が存在してしまうことになります。 また、新たに入荷した商品をこのテーブルに追加しようとしても、まだ販売してい ないため伝票番号、伝票番号は登録す るデータが無く、それなのにこれは主 キーであるため空値を指定することもできず。結局この商品は登録できません。 これらの問題は、受注日が伝票番号に依存しているのに商品コードには依存してい ないというように、値が一部の主キーにしか存在しないような列があるために存在 してしまいます。\\ この問題を解決するために、第二正規化を行います。 \subsection{第二正規形}  第二正規形とはテーブルが第一正規形であり、かつすべての非キー属性が主キーに対 して完全関数従属である場合をいいます。\\ 完全関数従属というのは、どちらかの属性値を決めてやると、もう片方の属性値 が決まるようなことです。 ここでは、伝票番号から受注日、顧客コード、顧客名 が、商品番号から商品名と単価が決定します。また、伝票番号と商品番号の組合 わせにより、数量が決定します。 これらをそれぞれ独立した別の表に分離するのが第二正規化で、正規化後の表は 図\ref{2seiki}のようになります。 \begin{figure}[h] \begin{center} \includegraphics {2seiki.eps} \caption{第二正規形} \label{2seiki} \end{center} \end{figure} この正規化により、主キーの一部に依存する列もなくなり、これで完了かと思う かも知れませんが、まだ、受注表において、先ほどと同様の問題が残っています (注文をしていない顧客が追加できないなど)。というわけで、第三正規化を行います \subsection{第三正規形} 第三正規形とは第二正規形で、すべての非キー属性が推移的に関数従属で ないものををいいます。 ここで推移的に関数従属というのは、ある属性を通じて二つの属性が従属関係に あるような状態を言います。 ここでは、非キー属性である顧客名が、顧客コードを通じて伝票番号に推移的 に従属(伝票番号から顧客コードが決定し、顧客コードから顧客名 が決定)しています。 第三正規化では、このような推移的従属関係にある項目を分離して、非キー属 性が互いに独立であるテーブルを作成します。 この正規化の結果得られる、図\ref{3seiki}のような全ての属性が主キーに従属 したリレーションを第三正規形といい、これが関係データモデルの基本的なテー ブル になります。 \begin{figure}[h] \begin{center} \includegraphics {3seiki.eps} \caption{第三正規形} \label{3seiki} \end{center} \end{figure} テーブルが分割されたとき、リレーショナルデータベースのあるテーブルの中で、他 のテーブルの主キーとして使われている項目のことを外部キーと言います。 ここで、受注表と顧客の関係において、受注表の顧客コードは顧客の主キーとして 使われているので、外部キーであると言えます。\\ リレーショナルデータベースでは第一から第三までの正規化を行うのが一般的な ようで、ボイスコッド正規形以降の正規化は実際に使用する機会は少ないよう です。 従って、ここまで出来れば矛盾を生じないデータベース設計の出来上がりです。 \section{課題} 図\ref{kadai}に、正規化されていないテーブルがあります。 これを正規化してみてください。\\ 余裕のある人は、正規化したテーブルをJasmineに定義してみましょう。 \begin{figure}[h] \begin{center} \includegraphics {kadai.eps} \caption{今日の課題} \label{kadai} \end{center} \end{figure} \end{document}