データベース 第1部 データモデリング 4 演習問題


 

4 演習問題

4.1 演習問題 1

4.1.1 エンティティの定義

 

(1) 名詞を抜き出しなさい

エンティティを見つけるためには、何らかの情報がないといけません。何の情報もなしにエンティティを見つけることはできません。

エンティティを見つけるためには、業務説明書などを参照します。業務説明書には、業務目的、業務の概要、システム画面イメージなどが記述されています。

また、通常、システムを開発する場合、システム開発の依頼者やシステムの利用者にヒアリングを行い、その結果を議事録としてまとめます。その場合には、エンティティを見つけるために議事録を参照します。

このように、業務説明書、議事録などを参考にして、業務で重要な概念が何かを検討します。しかし、業務説明書などを読んで重要な概念をすぐに思い浮かべるのは困難かもしれません。そこで、業務に関する説明や画面イメージから名詞を抜き出し、整理するという方法を行います。

ところで、以下のように業務説明や画面イメージなどから名詞を抜き出す際には、何らかの観点を持っておくと重要な概念を抜き出しやすいでしょう。例えば、次のようなものを名詞だと考えたらよいでしょう。

  • 人物や役割に関する名詞 (例)申込者、受講者、社員、講師
  • 場所や所属に関する名詞 (例)A社、セミナールーム
  • 物に関する名詞       (例)コース、情報
  • 出来事に関する名詞    (例)開催、受講

次の業務説明から名詞を抜き出しなさい。名詞と思われる言葉をクリックして選択しなさい(ただし、同じ言葉は最初に現れる部分しかクリックに対応していません)。


A社では、情報技術の講習会を開催している。講習会の開催、講習会への受講申込に関する業務内容は、以下のとおりである。

A社講習会システム
講習会開催
  • 講習会を開催するためには、A社の社員開催内容に関する情報講習会開催準備画面入力する。
    • 講習会名開催日講師セミナールーム定員
  • 講習会を開催するためには、講師とセミナールームが必要であり、1回の講習会を開催するのに講師は一人だけ、そしてセミナールームは1部屋だけ必要である。
  • A社には講師が複数いる。一人の講師が複数の講習会を担当する。
  • A社にはセミナールームが複数あり、セミナールームごとに座席数設定されている。
  • 講習会は複数用意されている。講習会はすべて1日間コースで同じに同じコースが並行して実施されることはない。また、コースごとに定員と受講料が決まっている。
○ 講習会の受講申込
  • 申込者講習会受講申込画面からログインし、必要な情報を入力して、講習会への受講を申し込む。
    • 申込者の氏名住所電話番号
    • 受講するコース、コースごとの受講者の氏名(共に複数可)
  • 申込者は1回の受講申込で、複数の講習会を申し込め、受講申込ごとに受講料合計請求される。
  • 受講者は申込ごとに固有コードが与えられ、開催される講習会とそのコードで識別される。




















 

(2) 業務で重要な管理対象である名詞を選択しなさい

抜き出した名詞が業務で重要な管理対象かどうかを判定します。業務で重要な管理対象であると思われる名詞を、クリックして選択しなさい。

名詞
A社講習会名複数講習会参加申込画面
講習会システム開催日座席数受講
講習会講師1日間氏名
開催セミナールームコース住所
社員定員電話番号
開催内容1回受講料受講者
情報一人受講申込受講料合計
講習会開催準備画面1部屋申込者コード





 

(3) 異音同義語、同音異義語を見つけなさい

名詞のみの情報があっても、異音同義語(e-mail や電子メールあるいはメールのように表現は異なるが同じものを表している言葉)と同音異義語(価格のように同じ表現が使われていますが、実際には販売時の価格や仕入時の価格というように、異なるものを表している言葉)を充分に検討できるとは限りません。そこで、名詞の意味を日本語などの自然言語で記述します。名詞の意味を記述することにより、異音同義語や同音異義語の発見がしやすくなります。

意味を定義する対象は、エンティティを見つける途中に登場する名詞だけではありません。エンティティに限らず、属性やリレーションシップなどのモデル要素のついては、その意味を記述するようにします。

もし「e-mail」、「電子メール」、「メール」という言葉があったのならば、例えば、「メール」という言葉に統一します。

もし「価格」という言葉があったのならば、何の「価格」なのかがはっきりしないので、例えば、「販売時の価格」、「仕入時の価格」というように明確化します。

異音同義語

異なる名詞であるけれども、意味が同じ名詞

     
同音異義語

同じ名詞であるけれども、意味が異なる名詞



異音同義語や同音異義語が含まれていないかどうかを判定します。異音同義語であると思われる単語を名詞の欄にドラッグし、そして「統一した名詞」を記述しなさい。同様に同音異義語であると思われる単語を名詞の欄にドラッグし、「明確化した名詞」を記述しなさい。






 

(4) エンティティの名称を選び出しなさい

エンティティ候補の名称を選び出すには名詞を以下の観点から2つのグループに分けます。

エンティティ名候補 複数の情報や複雑な情報を持つ名詞
属性名候補 単一の情報や単純な情報を持つ名詞

例えば、「商品」は、「商品名」や「仕入会社」、「仕入価格」などを持つ複雑な名詞です。それに対して、「商品名」は「商品」の名前にすぎません。よって、「商品」は、エンティティの名称の可能性が高いですし、「商品名」は「商品」エンティティの属性名の可能性が高いといえます。


エンティティとなり得る名称を、クリックして選択しなさい。

名詞
講習会定員受講者名
開催座席数住所
講習会名受講料電話番号
開催日申込受講者
講師申込者受講料合計
セミナールーム申込者名コード

注意
  • データモデリングを行う人が自分の経験や思い込みだけで名称をつけないようにする。
  • 同じような業務であっても、その業務を行う会社あるいは組織にとって、名称の使い方が同じであるとは限らない。
  • データモデリングを行う人の使う名称が、システム開発の依頼者、あるいはシステムの利用者にとって理解できるものでないといけない。




4.1.2 リレーションシップの定義

 

(1) 「講習会」、「開催」、「講師」エンティティ間にリレーションシップを定義しなさい

とりあえず「講習会」から考えてみましょう。

当然ながら「講習会」が「開催」されます。1度の「開催」で行われるのは1つの「講習会」だけです。そして、「講習会」が「開催」されるには、開催日やセミナールームなどとともに「講師」を決める必要があります。「講師」は、「講習会」によって、あらかじめ決まっているわけではなく、「開催」を決める時に決定されます。

  • 1度の「開催」で行われるのは1つの「講習会」だけ
  • 「講習会」が「開催」されるには、開催日やセミナールームなどとともに「講師」を決める必要がある
  • 「講師」は、「講習会」によって、あらかじめ決まっているわけではなく、「開催」を決める時に決定される

下の説明にあるカーディナリティとオプショナリティの図をドラッグして、講習会、開催、講師 エンティティ間のリレーションシップを完成してください。


講習会

開催

講師


カーディナリティとオプショナリティ
リレーションシップのそれぞれの側にある「種類の数」
 (0以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。
 (1以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。
 (0または1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。
 (1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。


 

(2) 「申込者」、「申込」、「受講者」エンティティ間にリレーションシップを定義しなさい

「申込」について考えてみましょう。

「申込者」は複数の「開催」に申し込めますが、「申込」は1件のみ作成されます。その後、申し込む「開催」を追加したとしても、「申込」は1件のみです。

申し込んだ「開催」ごとに別々の「受講者」が存在します。そして、「受講者」は「開催」ごと固有の「コード」が与えられ、それ以降この「コード」で管理されます。同じ「受講者」でも、「開催」が異なれば、違う「コード」が与えられるわけです。

  • 「申込」の「申込者」は一人だけ
  • 「申込」には、複数の「開催」が含まれる。同じ「申込者」の「申込」は1件のみ
  • 「申込」には、複数の「開催」が含まれるので、「受講者」も複数いることが考えられる。「受講者」は「コード」で管理される

下の説明にあるカーディナリティとオプショナリティの図をドラッグして、申込者、申込、受講者 エンティティ間のリレーションシップを完成してください。


申込者

申込

受講者


カーディナリティとオプショナリティ
リレーションシップのそれぞれの側にある「種類の数」
 (0以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。
 (1以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。
 (0または1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。
 (1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。


 

(3) 「開催」と「申込」エンティティ間のリレーションシップを定義しなさい

「開催」と「申込」について考えてみましょう。

同じ「開催」に対して、別々の「申込者」が「申込」することができます。

また、1回の「申込」で、異なる「講習会」の「開催」に対して、「申込」をすることができます。

下の説明にあるカーディナリティとオプショナリティの図をドラッグして、「開催」と「申込」エンティティ間のリレーションシップを完成してください。


申込者

申込

受講者
講習会

開催

講師


カーディナリティとオプショナリティ
リレーションシップのそれぞれの側にある「種類の数」
 (0以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。
 (1以上)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。
 (0または1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。
 (1)相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。





4.1.3 識別子と属性の定義

 

(1) エンティティに主キーを定義しなさい

主キーは、エンティティの属性の中でも特殊な属性です。主キーとは、エンティティのデータを1つだけ識別するための属性です。ただし、一つの属性からなるとは限りません。複数の属性で成り立つ主キーもあり、複合キーと呼ばれています。

主キーは、基本的に業務説明、画面イメージ、帳票イメージなどから発見した名詞から選びます。ただし、「申込番号」や「講師番号」などのように業務説明からでは発見できないものもあります。

また、「申込」には、「開催」が繰り返し項目として含まれています。したがって、複数の「開催番号」を含むと考えます。これも、業務説明からでは発見できないかもしれません。


それでは、「開催」と「受講者」に主キーが記述されていませんので、他のエンティティにならって指定してください。

ただし、主キーに指定できる名称は先に発見した属性か、この図の中にすでに記述してあるエンティティの主キーや属性のみです。


「開催」と「受講者」エンティティの主キーに、他のエンティティの主キーや属性名をドラッグするか直接入力して完成してください。


申込者
申込者番号





申込
申込番号
開催番号(FK)




受講者
 
 
 


講習会
講習会番号





開催





講師
講師番号





属性
属性名属性名とした理由
講習会名講習会の名称
開催日講習会の開催日
セミナールーム講習会の開催場所
定員講習会の定員
座席数セミナールームの最大収容人数
受講料講習会の受講料
申込者名申込者の氏名
受講者名受講者の氏名
住所受講者の住所
電話番号受講者の電話番号
受講料合計受講する講習会の受講料の合計
コード受講者コード


 

(2) エンティティに外部キーを定義しなさい

外部キーとは、リレーションシップの相手のエンティティが持つ属性です。リレーションシップの相手のエンティティの主キーを、エンティティがその属性として取り込みます。よって、外部キーによって、相手のエンティティのデータが一意に識別されます。

例えば、「申込」エンティティには、誰が「申込者」なのかが分かるように、「申込者」エンティティの主キーである「申込者番号」を外部キーとして持つ必要があります。これで、「申込者」を一人に絞り込めるわけです。

同様に、多対1のリレーションシップになっている、「受講者」エンティティから「申込」エンティティや、「開催」エンティティから「講師」エンティティを一意に識別される必要があります。


外部キーを示すために、「申込」エンティティの「申込者番号」には、横に FK(Foreign Key) という記号をつけます。


「開催」と「受講者」エンティティに、他のエンティティの主キーをドラッグするか直接入力して完成してください。


申込者
申込者番号






申込
申込番号
開催番号(FK)
申込者番号(FK)



受講者
開催番号(FK)
コード

講習会
講習会番号





開催
開催番号


講師
講師番号






 

(3) エンティティに属性を定義しなさい

属性に指定する名称は、先に発見した属性だけでなく、思いついたものも書き込んでください。

「講師」エンティティには、業務説明からは見つからなかった「講師名」を定義しています。


属性名をドラッグするか直接入力して完成してください。


申込者
申込者番号

申込
申込番号
開催番号(FK)
申込者番号(FK)


受講者
開催番号(FK)
コード
申込番号(FK)
講習会
講習会番号


開催
開催番号
講習会番号 (FK)
講師番号 (FK)

講師
講師番号
講師名




属性
属性名属性名とした理由
講習会名講習会の名称
開催日講習会の開催日
セミナールーム講習会の開催場所
定員講習会の定員
座席数セミナールームの最大収容人数
受講料講習会の受講料
申込者名申込者の氏名
受講者名受講者の氏名
住所受講者の住所
電話番号受講者の電話番号
受講料合計受講する講習会の受講料の合計
コード受講者コード





4.1.4 正規化

 

(1) 第1正規化を行いなさい

第一正規形とは、「繰り返し項目」を持たない状態です。すべての状態を1つのエンティティで管理すると、いくつかの項目が繰り返し記述されてしまうことがあります。この問題を解決するために繰り返し記載される項目を別のエンティティとして構成する必要があります。

第一正規化とは、繰り返し部分の属性を他のエンティティに分離することです。

「申込」エンティティと「開催」エンティティには、多対多のリレーションシップがあります。多対多のリレーションシップは、何らかのエンティティを見逃していることを示しています。

もう一度、業務説明を見直してみましょう。「1回の受講申込で、複数の講習会を申し込める」となっています。つまり、この「申込」エンティティには複数の「開催」という繰り返しがあるということが分かります。よって、この多対多のリレーションシップに対して第1正規化が必要となります。

よって、「申込」エンティティと「開催」エンティティの間の多対多のリレーションシップを解消します。

そして、「申込明細」エンティティを新たに作成して、 「申込」エンティティと「開催」エンティティに対して、リレーションシップを追加してください。

また、 「申込明細」エンティティの主キーや外部キーも記述してください。ただし、 その他の属性は、開催された講習会ごとの受講する人数を「受講者数」、開催された講習会ごとの受講料の合計を「受講料小計」として追加しています。

さらに、開催される一つひとつの講習会に対して、受講者がいるわけですから、「受講者」エンティティは、「申込」エンティティではなく「申込明細」エンティティとリレーションシップが定義されることになります。リレーションシップの関係が変わるわけですから、外部キーの定義も変わりますので忘れないで指定してください。



申込
申込番号
申込者番号(FK)
受講料合計




申込明細
申込番号(FK)
開催番号(FK)
受講者数
受講料小計

受講者
開催番号(FK)
コード
申込番号(FK)
受講者名
開催
開催番号
講習会番号(FK)
講師番号 (FK)
開催日
受講料
セミナールーム
座席数


カーディナリティとオプショナリティ
 (0以上)
 (1以上)
 (0または1)
 (1)


 

(2) 第2正規化を行いなさい

第二正規形とは、「すべての属性が、主キー(主キーが複数の属性から構成されている場合はその全ての項目) に完全に従属している(一意に識別できる)状態」です。

第二正規化とは、主キーの一部に従属する属性を他のエンティティに分離することです。

「開催」エンティティの「受講料」は、同じ「講習会」でも「開催日」や「講師」によっても金額が変わるのならば必要です。しかし、講習会が決まれば自動的に金額が決まるのだとすれば、「開催」エンティティに存在する必要のない属性と考えられます。

変更の必要のあるエンティティを定義しなおしなさい。





 

(3) 第3正規化を行いなさい

第三正規形とは、「すべての属性が主キー以外の属性にも完全に従属している(一意に識別できる)状態」です。

第三正規化とは、主キー以外の属性に従属する属性を他のエンティティに分離することです。

「開催」エンティティの「座席数」は、セミナールームが決まれば自動的に決まるので、「開催」エンティティに存在する必要のない属性です。よって、 「開催」エンティティから取り除きます。

しかし、単に「開催」エンティティから削除してしまっては、セミナールームの座席数が分からなくなってしまいますので、新たに「セミナールーム」エンティティを追加して、そこに持たせるようにします。ここでは、ついでに「ルーム名」という属性も持たせています。

また、「開催」エンティティと「セミナールーム」エンティティとのリレーションシップは、「セミナールーム」エンティティが1に対して、「開催」エンティティが0以上の1対多となります。(コースを開催するにはセミナールームが1つだけ必要ですが、どのコースの開催でも使用されていないセミナールームがあるかもしれない)







4.1.5 導出属性と重複属性

 

(1) 導出属性を削除しなさい

第三正規化が終わったER図は図のようになりました。

かなりすっきりしたのですが、まだ無駄があります。導出属性が存在しているからです。導出属性とは、他の属性から導き出せる値を持つ属性です。

導出属性を探して、取り除いてください。



申込者
申込者番号
申込者名
住所
電話番号



申込
申込番号
申込者番号(FK)
受講料合計




申込明細
申込番号(FK)
開催番号(FK)
受講者数
受講料小計



受講者
開催番号(FK)
コード
申込番号(FK)
受講者名


講習会
講習会番号
講習会名
定員
受講料



開催
開催番号
講習会番号(FK)
講師番号 (FK)
開催日
ルーム番号 (FK)


講師
講師番号
講師名




セミナー ルーム
ルーム番号
ルーム名
座席数




 

(2) 重複属性を追加しなさい

重複属性は、以下のような特徴があります。

  • 元となるエンティティの値が変更されたら、重複属性も同じように更新しなければ、整合性が取れなくなる
  • 重複属性を持てば検索のレスポンスは速くなるが、更新時にはすべての重複属性を更新しなければならないので更新のレスポンスは遅くなる

しかし、すべての重複属性が必ずしも更新されなければいけないわけではありません。

たとえば、商品に金額があり、また売り上げ明細に金額がある場合は、金額が重複属性となります。しかし、売り上げ明細の金額をなくしてしまうと、商品の金額が改定された時に、過去の売上金額が分からなくなってしまいます。

このように、元のエンティティが更新されても、一緒に更新する必要のない、あるいは一緒に更新してはいけない、あるいは更新するのに負荷が大きい属性であれば、重複属性を持つことも検討すべきです。

属性名をドラッグするか直接入力することによって、導入すべき重複属性を追加しなさい。


申込者
申込者番号
 申込者名
 住所
 電話番号
 
 

申込
申込番号
申込者番号(FK)
 受講料合計
 
 
 

申込明細
申込番号(FK)
開催番号(FK)
 受講者数
 受講料小計
 
 
 

受講者
開催番号(FK)
コード
申込番号(FK)
 受講者名
 
 
講習会
講習会番号
 講習会名
 定員
 受講料
 
 
 

開催
開催番号
講習会番号(FK)
講師番号(FK)
開催日
ルーム番号 (FK)
 
 

講師
講師番号
 講師名
 
 
 
セミナー ルーム
ルーム番号
 ルーム名
 座席数
 
 
 






4.2 演習問題2

ある販売会社S社では、自社の販売している商品の注文を次ページに示すFAXオーダシートで受け付けています。このFAXオーダシートの範囲で、エンティティを定義しER図を作成しなさい




(1)手順その1 エンティティの定義

(2)手順その2 リレーションシップの定義

(3)手順その3 主キーの定義

(4)手順その4 外部キーの定義

(5)手順その5 属性の定義

(6)手順その6 正規化

(7)手順その7 導出属性と重複属性