[ACC] データベースの正規化の基礎

文書翻訳 文書翻訳
文書番号: 100139 - 対象製品
難易度 : 低。シングル ユーザー コンピュータのユーザー インターフェイスに関する知識が必要です。

すべて展開する | すべて折りたたむ

目次

概要

この資料では、データベースの正規化の専門用語の基礎について説明します。ここで説明する専門用語の基礎を理解しておくと、リレーショナル データベースの設計について検討するときに役立ちます。

: マイクロソフトは、データベースの正規化の基礎を説明する WebCast も提供しています。この WebCast を表示するには、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/servicedesks/webcasts/wc060600/wc060600.asp?fr=1
: この資料で説明している内容の Microsoft Access 2000 に対応する情報に関しては、次の「サポート技術情報」 (Microsoft Knowledge Base) を参照してください。
209534 [ACC2000] データベースの正規化の基礎

詳細

正規化の説明

正規化とは、データベース内のデータを構築する手順のことです。正規化には、データを適切に保護しながらデータベースをより柔軟なものにするために特別に設計された規則に従い、2 つの要素の除去 (冗長性の除去および一貫性のない従属関係の除去) を実行することによってテーブルを作成する作業、および作成したテーブル間のリレーションシップを確立する作業が含まれます。

冗長なデータがあると、ディスク領域が浪費され、保守上の問題点が生じます。複数の場所に存在するデータの変更が必要な場合、すべての場所でそれらのデータが常に同一になるように変更する必要があります。顧客の住所を変更する際に、データが保存されているのが顧客テーブルのみで、データベース内の他のテーブルに存在しない場合、変更作業を簡単に行えます。

"一貫性のない従属関係" とは何でしょうか。ユーザーが特定の顧客の住所を顧客テーブルで調べることは簡単ですが、その顧客を担当している社員の給与まで、そのテーブルで調べることには意味がありません。社員の給与は、社員に関連付けられているか、または社員に従属するため、社員テーブルに移動する必要があります。しかし、一貫性のない従属関係があると、データを見つけるパスが存在しないか破損していることになり、データへのアクセスが困難になります。

データベースの正規化にはいくつかの規則があり、それぞれの規則を適用した状態は "正規形" と呼ばれます。最初の規則に従っているデータベースは "第 1 正規形" であるといわれます。最初の 3 つの規則に従っているデータベースは "第 3 正規形" であると見なされます。他のレベルの正規化も可能ですが、第 3 正規形がほとんどのアプリケーションで最も高いレベルと見なされています。

多くの規則や規格がそうであるように、現実のシナリオは常に規則に完全に適合しているとは限りません。一般的に、正規化を行うと追加テーブルが必要となるため、わずらわしいと感じるユーザーもいます。正規化の最初の 3 つの規則のいずれかに従わずに設計する場合、冗長データや一貫性のない従属関係など、アプリケーションで発生する可能性のある問題点を考慮しておく必要があります。

: 以下では例を使用して説明しています。

第 1 正規形

  • 各テーブルで繰り返し現れるグループを除去します。
  • 関連するデータごとに 1 つのテーブルを作成します。
  • 関連するデータ セットを主キーで識別します。
類似したデータを格納するために、1 つのテーブルで複数のフィールドを使用しないようにします。たとえば、在庫項目が 2 つの製造元から納入される場合、在庫レコードで "製造元コード 1" フィールドおよび "製造元コード 2" フィールドを使用して、その項目を追跡するケースを考えてみます。

3 番目の製造元が追加されるとどうなるでしょう。単にフィールドを追加するだけでは作業は完了しません。単にフィールドを追加しただけでは、プログラムとテーブルの変更を必要とし、製造元の数が動的に変化する場合、スムーズに調整することができません。代わりに、すべての製造元情報を別の製造元テーブルに配置し、項目番号キーを使用して製造元を在庫にリンクするか、製造元コード キーを使用して在庫を製造元にリンクします。

第 2 正規形

  • 複数のレコードに該当する値のセットごとに 1 つのテーブルを作成します。
  • これらのテーブルを外部キーと関連付けます。
レコードが、テーブルの主キー (必要な場合は、複合キー) 以外に従属しないようにする必要があります。たとえば、財務システムにおける顧客の住所を考えてみます。住所は顧客テーブルで必要ですが、受注、出荷、請求、売掛金、および回収の各テーブルでも必要です。これらすべてのテーブルに顧客の住所を個別のエントリとして格納するのではなく、顧客テーブルまたは個別の住所テーブルのいずれか 1 つに格納します。

第 3 正規形

  • キーに従属しないフィールドを除去します。
レコードに、キーの一部ではない値が含まれる場合、その値を別のテーブルに分離します。一般的に、一連のフィールドの内容が、テーブル内の複数のレコードに適用されるときは、それらのフィールドを別のテーブルに配置することを検討します。

たとえば、社員募集テーブルに、志願者の大学の名前と住所が含まれているとします。しかし、大学に募集要項を送付するには、大学の完全な一覧を必要とします。大学の情報が志願者テーブルに格納されている場合、現在志願者がいない大学の一覧を取得することができません。この場合、別に大学テーブルを作成し、大学コード キーを使用して志願者テーブルにリンクします。

例外 : 第 3 正規形を遵守することが理論上望ましくても、常に実用性があるとは限りません。顧客テーブルを使用していて、起こり得る内部フィールドの従属関係をすべて除去したい場合、都市、郵便番号、販売員、顧客クラス、および複数のレコードに重複する可能性があるその他すべての要素に対して個別のテーブルを作成する必要があります。理論上、正規化は実践する価値がありますが、小さいテーブルを数多く作成するとパフォーマンスが低下し、開くことのできるファイルやメモリの容量の上限を超える場合があります。

第 3 正規形は、頻繁に変更されるデータに対してのみ適用する方がより現実に即しています。従属フィールドが残っている場合、それらのいずれかが変更されるときに、関連付けられたすべてのフィールドの確認がユーザーによって行われるようにアプリケーションを設計します。

その他の正規形

ボイスコッド正規形 (BCNF) とも呼ばれる第 4 正規形、および第 5 正規形が存在しますが、実用的な設計と見なされることはほとんどありません。これらの規則を無視すると、完全なデータベース設計とはならないことがありますが、機能的には影響しません。
               **********************************
                 正規化テーブルの例
               **********************************
正規化手順の例で使用する
正規化されていないテーブル
    Student#   Advisor   Adv-Room  Class1   Class2   Class3
    -------------------------------------------------------
    1022       Jones      412      101-07   143-01   159-02
    4123       Smith      216      201-01   211-02   214-01
				
  1. 第 1 正規形 : 繰り返しグループの除去

    テーブルは、2 次元のみになるように設計する必要があります。一人の学生は複数のクラスを受講するため、クラスは別のテーブルにまとめる必要があります。上記のレコードに、Class1、Class2、Class3 のフィールド作成されている点が設計上の問題です。

    スプレッドシートでは、第 3 次元を頻繁に使用しますが、テーブルでは使用するべきではありません。上記の例の問題を他の言葉で言い換えると、"一対多関係" にあります。"一対多" の "一" の側と "多" の側の両方を同じテーブルに配置しないようにします。繰り返しグループ (Class#) を除去して、次のように、第 1 正規形で別のテーブルを作成します。
           Student#   Advisor   Adv-Room    Class#
           ---------------------------------------
           1022      Jones      412       101-07
           1022      Jones      412       143-01
           1022      Jones      412       159-02
           4123      Smith      216       201-01
           4123      Smith      216       211-02
           4123      Smith      216       214-01
    					
  2. 第 2 正規形 : 冗長データの除去

    上記の表では、各 Student# 値に複数の Class# 値があることに注目します。Class# が、Student# (主キー) に関数従属していません。そのため、このリレーションシップは、第 2 正規形ではありません。

    第 2 正規形にまとめると、以下の 2 つのテーブルのようになります。
        Students:   Student#    Advisor   Adv-Room
                    ------------------------------
                    1022        Jones       412
                    4123        Smith       216
        Registration:   Student#    Class#
                        ------------------
                        1022        101-07
                        1022        143-01
                        1022        159-02
                        4123        201-01
                        4123        211-02
                        4123        214-01
    					
  3. 第 3 正規形 : キーに従属しないデータの除去

    上記の例で、Adv-Room (教授の部屋番号) は Advisor (教授) 属性に関数従属しています。この場合の解決法は、以下のように、その属性を学生テーブルから教授テーブルに移動することです。
        Students:   Student#    Advisor
                    -------------------
                    1022        Jones
                    4123        Smith
        Faculty:    Name    Room    Dept
                    --------------------
                    Jones   412     42
                    Smith   216     42
    					

関連情報

データベース設計の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
234208 [ACC2000] ダウンロード センターで入手可能なリレーショナル データベースの設計に関する文書
『FoxPro 2 A Developer's Guide』Hamilton M. Ahlo Jr. et al., pages 220-225, M & T Books, 1991

『Using Access for Windows』Roger Jennings, pages 799-800, Que Corporation, 1993

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 100139 (最終更新日 2003-05-06) を基に作成したものです。

プロパティ

文書番号: 100139 - 最終更新日: 2004年7月28日 - リビジョン: 2.0
この資料は以下の製品について記述したものです。
  • Microsoft Access 1.0 Standard Edition
  • Microsoft Access 1.1 Standard Edition
  • Microsoft Access 2.0 Standard Edition
  • Microsoft Access 95 Standard Edition
  • Microsoft Access 97 Standard Edition
キーワード:?
kbinfo kbusage KB100139
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com