テーブルの正規化

新規にテーブル設計する場合、まず最初にテーブルの正規化を行う事をお勧めします。「テーブルの正規化」とはBaseの画面上で何らかの操作をするわけではなく、データベースを効率的に運用するためにテーブルの設計を考え直す作業の事です。
皆さんが新規にテーブルを設計しようとする場合、その動機には色々あると思います。一般的には、現行のシステムを改善する事を目的として、データベース上にテーブルを実装しようとするものでしょうが、「現行のシステム」といっても様々な例があって一概には言えません。この章ではExcelCalcなど、スプレッド・シート上でデータ処理をしている現状から改善する例を想定してお話します。

第一正規化

①まず、下図のような非正規形の受注伝票を想定してみましょう。

②これを1伝票1レコードとして行列形式のテーブルに並べ替えてみます。すると下図のようなテーブルになります。このようなテーブルは各レコードの長さがまちまちであり、しかも商品明細部分(商品コード~金額)の項目が繰り返し存在していますので、このままではデータベースとして扱いずらい状態になっています。

③そこで、テーブルの項目に繰り返し現れる項目が無い状態にして整理しなおしたのが下図のテーブルです。

なお、「金額」項目は計算で求められるので不要です。金額を除いた形が第一正規形です。

第二正規化

第一正規形からプライマリーキーが一意(ユニーク)になるようにテーブルを分割して第二正規形にします。例に挙げた受注データのプライマリーキーは「受注No.」です。
下図が分割後のテーブルです。

※ 分割後に項目内容が重複するレコードは削除します。上図の例では受注日付、顧客コード、顧客名は受注No.が同じであれば同じ内容になりますので、1受注No.1レコードとしています。
また、商品明細は1受注No.に複数のレコードが存在しますので、上図のように先頭に受注No.を付与します。

第三正規化

次にプライマリーキー以外で、さらに分割できる項目を見つけ、それを独立したテーブルに分割して第三正規形にします。
例に挙げた受注データでは顧客コードと顧客名、また、商品コードと商品名および単価が独立したテーブルに分割することが可能です。
分割した各テーブルに名前を付けたのが下図です。テーブル「受注伝票」では顧客コードによって顧客マスターを参照して顧客名を取得します。また、テーブル「商品明細」では商品コードによって商品マスターを参照して商品名と単価を取得します。
トランザクション・テーブルから各マスター・テーブルを参照する機能はリレーションシップによって実現します。

※ テーブル分割して設定した顧客マスターのように「顧客名」が「顧客コード」によって決まることを、少し難しい表現ですが「関数従属している」といいます。商品マスターでは「商品名」と「単価」が「商品コード」に関数従属しています。テーブル分割する際にはこのような「関数従属」の概念が重要なポイントになります。

(注1)この章ではExcelCalcなど、スプレッド・シート上でデータの扱い方を説明しましたが、「スプレッド・シートを運用する上でこのようにするべきだ」と言っているわけではありません。あくまでもデータベース上でテーブル設計をする場合の考え方を説明していますので、誤解のないようお願いします。
(注2)データベース管理に慣れたらこのような思考過程を経なくても効率の良いテーブル設計をすることができるようになります。

Back> 1.データベースとテーブルについて
Next> 3.テーブル設計

タイトルとURLをコピーしました