初めてのデータベース設計

第3回 リレーショナルモデルへの変換

この記事を読むのに必要な時間:およそ 2 分

前回は,IDEF1XによってER図を記述する方法について説明しました。ER図によって記述された概念モデルは,基本的に特定のデータモデルを意識したものではありません。

したがって,概念モデルをリレーショナルモデルとして適切な形式に変換する必要があります。これは,データベース設計においては論理設計の段階にあたります。今回は,概念モデルからリレーショナルモデルに変換する手順について説明します。

多対多の関連

概念モデルでは実体間を多対多の関連として記述することができます。たとえば,「顧客が製品を注文する」ということは,図1のように「顧客」「製品」という実体間を「注文する」という関連として記述することができます。

図1 「顧客が製品を注文する」の概念モデル

図1 「顧客が製品を注文する」の概念モデル

このとき,顧客は複数の製品を注文し,製品は複数の顧客から注文されるということであれば,「注文する」という関連は多対多となります。

しかしながら,このような多対多の関連は,データをテーブル(リレーション)として表現するリレーショナルモデルでは取り扱うことができません。

多対多の関連は,Oracleであればコレクション型,PostgreSQLであれば配列型といった特殊なデータ型を使用することによって実現できないこともありませんが,通常,多対多の関連の間に実体を追加し,図2のように「顧客」「注文」を1対多,「注文」「製品」を多対1の関連として変換します。

図2 リレーショナルモデルに変換

図2 リレーショナルモデルに変換

正規形とは

概念モデルから多対多の関連を取り除きさえすれば,実体をテーブルに置き換え,関連を外部キー制約として定義することにより,リレーショナルモデルへの変換を行うことができます。

しかし,そのまま概念モデルからテーブルに変換しただけでは,リレーショナルモデルとして適切な形式にならない場合があります。そこで,正規形と呼ばれるリレーショナルモデルとして適切な形式への変換を行います。なお,テーブルを正規形に変換することを正規化と呼びます。

テーブルを正規形に変換することによって,データの冗長性や不整合の発生を減少させることができます。一言に正規形といってもいろいろなものがありますが,ここでは一般的に適用されている第1正規形第2正規形,第3正規形について説明します。

正規形について説明するため,例として表1のテーブルを取り上げます。このテーブルは,顧客からの注文に関する情報を格納するもので,「注文番号」が主キーとなります。

表1注文

表1 注文

第1正規形

第1正規形(First Normal Form;1NF)は,テーブルの列がそれ以上分割できない値のみをもつテーブルのことです。配列やリスト,テーブルの中にテーブルが含まれるような形式で列の値をもつテーブルは,第1正規形ではありません。

たとえば,表1の第1正規形に変換する前のテーブルでは,「製品番号」「製品名」,「価格」,「数量」といった列の値が1つの行に繰り返し存在しています。そこで,繰り返し存在する列を「注文明細」という別のテーブルとして分割することにより,表2のように第1正規形に変換することができます。

表2

注文

表2 注文

注文明細

表2 注文明細

「注文明細」では,分割したテーブルを元に戻せるように「注文番号」を外部キーとして「注文」に関連付けており,「注文番号」「製品番号」が主キーとなります。

テーブルを第1正規形に変換することにより,リレーショナルモデルとして演算できる対象となります。しかし,テーブルを第1正規形に変換しただけではデータの冗長性が存在しており,それを減少させるには第2正規形,第3正規形へと変換していく必要があります。

著者プロフィール

佐藤友章(さとうともあき)

SRA OSS, Inc. 日本支社 チーフエンジニア。入社以来,オープンソースデータベースPostgreSQLに関する業務に携わり,現在,PostgreSQLのサポートやコンサルティング,トレーニングの講師を務める。

URLhttp://www.sraoss.co.jp/

コメント

  • 間違うと思う

    「注文」と「製品」を多対1の関連
    ー>
    「注文」と「製品」を多対多の関連だと思う。

    注文    製品
    book注文 BOOK_1, book2

    book1注文 BOOK_1,book3

    私がまちがったら説明していただけば幸いです。

    よろしくお願いいたします。

    Commented : #1  dien (2015/03/03, 18:57)

コメントの記入