エンティティを見つけるためには、何らかの情報がないといけません。何の情報もなしにエンティティを見つけることはできません。
エンティティを見つけるためには、業務説明書などを参照します。業務説明書には、業務目的、業務の概要、システム画面イメージなどが記述されています。
また、通常、システムを開発する場合、システム開発の依頼者やシステムの利用者にヒアリングを行い、その結果を議事録としてまとめます。その場合には、エンティティを見つけるために議事録を参照します。
このように、業務説明書、議事録などを参考にして、業務で重要な概念が何かを検討します。しかし、業務説明書などを読んで重要な概念をすぐに思い浮かべるのは困難かもしれません。そこで、業務に関する説明や画面イメージから名詞を抜き出し、整理するという方法を行います。
ところで、以下のように業務説明や画面イメージなどから名詞を抜き出す際には、何らかの観点を持っておくと重要な概念を抜き出しやすいでしょう。例えば、次のようなものを名詞だと考えたらよいでしょう。
次の業務説明から名詞を抜き出しなさい。名詞と思われる言葉をクリックして選択しなさい(ただし、同じ言葉は最初に現れる部分しかクリックに対応していません)。
A社では、情報技術の講習会を開催している。講習会の開催、講習会への受講申込に関する業務内容は、以下のとおりである。
抜き出した名詞が業務で重要な管理対象かどうかを判定します。業務で重要な管理対象であると思われる名詞を、クリックして選択しなさい。
| A社 | 講習会名 | 複数 | 講習会参加申込画面 |
| 講習会システム | 開催日 | 座席数 | 受講 |
| 講習会 | 講師 | 1日間 | 氏名 |
| 開催 | セミナールーム | コース | 住所 |
| 社員 | 定員 | 日 | 電話番号 |
| 開催内容 | 1回 | 受講料 | 受講者 |
| 情報 | 一人 | 受講申込 | 受講料合計 |
| 講習会開催準備画面 | 1部屋 | 申込者 | コード |
名詞のみの情報があっても、異音同義語(e-mail や電子メールあるいはメールのように表現は異なるが同じものを表している言葉)と同音異義語(価格のように同じ表現が使われていますが、実際には販売時の価格や仕入時の価格というように、異なるものを表している言葉)を充分に検討できるとは限りません。そこで、名詞の意味を日本語などの自然言語で記述します。名詞の意味を記述することにより、異音同義語や同音異義語の発見がしやすくなります。
意味を定義する対象は、エンティティを見つける途中に登場する名詞だけではありません。エンティティに限らず、属性やリレーションシップなどのモデル要素のついては、その意味を記述するようにします。
もし「e-mail」、「電子メール」、「メール」という言葉があったのならば、例えば、「メール」という言葉に統一します。
もし「価格」という言葉があったのならば、何の「価格」なのかがはっきりしないので、例えば、「販売時の価格」、「仕入時の価格」というように明確化します。
異音同義語異なる名詞であるけれども、意味が同じ名詞
|
同音異義語同じ名詞であるけれども、意味が異なる名詞
|
異音同義語や同音異義語が含まれていないかどうかを判定します。異音同義語であると思われる単語を名詞の欄にドラッグし、そして「統一した名詞」を記述しなさい。同様に同音異義語であると思われる単語を名詞の欄にドラッグし、「明確化した名詞」を記述しなさい。
エンティティ候補の名称を選び出すには名詞を以下の観点から2つのグループに分けます。
| エンティティ名候補 | 複数の情報や複雑な情報を持つ名詞 |
| 属性名候補 | 単一の情報や単純な情報を持つ名詞 |
例えば、「商品」は、「商品名」や「仕入会社」、「仕入価格」などを持つ複雑な名詞です。それに対して、「商品名」は「商品」の名前にすぎません。よって、「商品」は、エンティティの名称の可能性が高いですし、「商品名」は「商品」エンティティの属性名の可能性が高いといえます。
エンティティとなり得る名称を、クリックして選択しなさい。
| 講習会 | 定員 | 受講者名 |
| 開催 | 座席数 | 住所 |
| 講習会名 | 受講料 | 電話番号 |
| 開催日 | 申込 | 受講者 |
| 講師 | 申込者 | 受講料合計 |
| セミナールーム | 申込者名 | コード |
とりあえず「講習会」から考えてみましょう。
当然ながら「講習会」が「開催」されます。1度の「開催」で行われるのは1つの「講習会」だけです。そして、「講習会」が「開催」されるには、開催日やセミナールームなどとともに「講師」を決める必要があります。「講師」は、「講習会」によって、あらかじめ決まっているわけではなく、「開催」を決める時に決定されます。
下の説明にあるカーディナリティとオプショナリティの図をドラッグして、講習会、開催、講師 エンティティ間のリレーションシップを完成してください。
講習会 |
開催 |
講師 |
![]() | (0以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。 |
![]() | ||
![]() | (1以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。 |
![]() | ||
![]() | (0または1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。 |
![]() | ||
![]() | (1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。 |
「申込」について考えてみましょう。
「申込者」は複数の「開催」に申し込めますが、「申込」は1件のみ作成されます。その後、申し込む「開催」を追加したとしても、「申込」は1件のみです。
申し込んだ「開催」ごとに別々の「受講者」が存在します。そして、「受講者」は「開催」ごと固有の「コード」が与えられ、それ以降この「コード」で管理されます。同じ「受講者」でも、「開催」が異なれば、違う「コード」が与えられるわけです。
下の説明にあるカーディナリティとオプショナリティの図をドラッグして、申込者、申込、受講者 エンティティ間のリレーションシップを完成してください。
申込者 |
申込 |
受講者 |
![]() | (0以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。 |
![]() | ||
![]() | (1以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。 |
![]() | ||
![]() | (0または1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。 |
![]() | ||
![]() | (1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。 |
「開催」と「申込」について考えてみましょう。
同じ「開催」に対して、別々の「申込者」が「申込」することができます。
また、1回の「申込」で、異なる「講習会」の「開催」に対して、「申込」をすることができます。
下の説明にあるカーディナリティとオプショナリティの図をドラッグして、「開催」と「申込」エンティティ間のリレーションシップを完成してください。
申込者 |
![]() |
![]() |
申込 |
![]() |
![]() |
受講者 |
講習会 |
![]() |
![]() |
開催 |
![]() |
![]() |
講師 |
![]() ![]() | (0以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないこともあるし、複数存在することもある。 |
![]() ![]() | (1以上) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個以上存在する。 |
![]() ![]() | (0または1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは存在しないか1個だけ存在する。 |
![]() | (1) | 相手のエンティティのデータに対して、この終端に接続されるエンティティのデータは必ず1個存在する。 |
主キーは、エンティティの属性の中でも特殊な属性です。主キーとは、エンティティのデータを1つだけ識別するための属性です。ただし、一つの属性からなるとは限りません。複数の属性で成り立つ主キーもあり、複合キーと呼ばれています。
主キーは、基本的に業務説明、画面イメージ、帳票イメージなどから発見した名詞から選びます。ただし、「申込番号」や「講師番号」などのように業務説明からでは発見できないものもあります。
また、「申込」には、「開催」が繰り返し項目として含まれています。したがって、複数の「開催番号」を含むと考えます。これも、業務説明からでは発見できないかもしれません。
それでは、「開催」と「受講者」に主キーが記述されていませんので、他のエンティティにならって指定してください。
ただし、主キーに指定できる名称は先に発見した属性か、この図の中にすでに記述してあるエンティティの主キーや属性のみです。
「開催」と「受講者」エンティティの主キーに、他のエンティティの主キーや属性名をドラッグするか直接入力して完成してください。
| ![]() |
![]() |
| ![]() |
![]() |
|
![]() |
![]() |
| ![]() |
![]() |
|
![]() |
![]() |
|
| 属性名 | 属性名とした理由 |
|---|---|
| 講習会名 | 講習会の名称 |
| 開催日 | 講習会の開催日 |
| セミナールーム | 講習会の開催場所 |
| 定員 | 講習会の定員 |
| 座席数 | セミナールームの最大収容人数 |
| 受講料 | 講習会の受講料 |
| 申込者名 | 申込者の氏名 |
| 受講者名 | 受講者の氏名 |
| 住所 | 受講者の住所 |
| 電話番号 | 受講者の電話番号 |
| 受講料合計 | 受講する講習会の受講料の合計 |
| コード | 受講者コード |
外部キーとは、リレーションシップの相手のエンティティが持つ属性です。リレーションシップの相手のエンティティの主キーを、エンティティがその属性として取り込みます。よって、外部キーによって、相手のエンティティのデータが一意に識別されます。
例えば、「申込」エンティティには、誰が「申込者」なのかが分かるように、「申込者」エンティティの主キーである「申込者番号」を外部キーとして持つ必要があります。これで、「申込者」を一人に絞り込めるわけです。
同様に、多対1のリレーションシップになっている、「受講者」エンティティから「申込」エンティティや、「開催」エンティティから「講師」エンティティを一意に識別される必要があります。
外部キーを示すために、「申込」エンティティの「申込者番号」には、横に FK(Foreign Key) という記号をつけます。
「開催」と「受講者」エンティティに、他のエンティティの主キーをドラッグするか直接入力して完成してください。
| ![]() |
![]() |
| ![]() |
![]() |
受講者
|
![]() |
![]() |
| ![]() |
![]() |
開催
|
![]() |
![]() |
|
属性に指定する名称は、先に発見した属性だけでなく、思いついたものも書き込んでください。
「講師」エンティティには、業務説明からは見つからなかった「講師名」を定義しています。
属性名をドラッグするか直接入力して完成してください。
| ![]() |
![]() |
| ![]() |
![]() |
受講者
|
![]() |
![]() |
| ![]() |
![]() |
開催
|
![]() |
![]() |
|
| 属性名 | 属性名とした理由 |
|---|---|
| 講習会名 | 講習会の名称 |
| 開催日 | 講習会の開催日 |
| セミナールーム | 講習会の開催場所 |
| 定員 | 講習会の定員 |
| 座席数 | セミナールームの最大収容人数 |
| 受講料 | 講習会の受講料 |
| 申込者名 | 申込者の氏名 |
| 受講者名 | 受講者の氏名 |
| 住所 | 受講者の住所 |
| 電話番号 | 受講者の電話番号 |
| 受講料合計 | 受講する講習会の受講料の合計 |
| コード | 受講者コード |
第一正規形とは、「繰り返し項目」を持たない状態です。すべての状態を1つのエンティティで管理すると、いくつかの項目が繰り返し記述されてしまうことがあります。この問題を解決するために繰り返し記載される項目を別のエンティティとして構成する必要があります。
第一正規化とは、繰り返し部分の属性を他のエンティティに分離することです。
「申込」エンティティと「開催」エンティティには、多対多のリレーションシップがあります。多対多のリレーションシップは、何らかのエンティティを見逃していることを示しています。
もう一度、業務説明を見直してみましょう。「1回の受講申込で、複数の講習会を申し込める」となっています。つまり、この「申込」エンティティには複数の「開催」という繰り返しがあるということが分かります。よって、この多対多のリレーションシップに対して第1正規化が必要となります。
よって、「申込」エンティティと「開催」エンティティの間の多対多のリレーションシップを解消します。
そして、「申込明細」エンティティを新たに作成して、 「申込」エンティティと「開催」エンティティに対して、リレーションシップを追加してください。
また、 「申込明細」エンティティの主キーや外部キーも記述してください。ただし、 その他の属性は、開催された講習会ごとの受講する人数を「受講者数」、開催された講習会ごとの受講料の合計を「受講料小計」として追加しています。
さらに、開催される一つひとつの講習会に対して、受講者がいるわけですから、「受講者」エンティティは、「申込」エンティティではなく「申込明細」エンティティとリレーションシップが定義されることになります。リレーションシップの関係が変わるわけですから、外部キーの定義も変わりますので忘れないで指定してください。
|
申込明細
|
受講者
|
|
開催
|
![]() | ![]() ![]() | (0以上) |
![]() | ||
![]() | ![]() ![]() | (1以上) |
![]() | ||
![]() | ![]() ![]() | (0または1) |
![]() | ||
![]() | ![]() | (1) |
第二正規形とは、「すべての属性が、主キー(主キーが複数の属性から構成されている場合はその全ての項目) に完全に従属している(一意に識別できる)状態」です。
第二正規化とは、主キーの一部に従属する属性を他のエンティティに分離することです。
「開催」エンティティの「受講料」は、同じ「講習会」でも「開催日」や「講師」によっても金額が変わるのならば必要です。しかし、講習会が決まれば自動的に金額が決まるのだとすれば、「開催」エンティティに存在する必要のない属性と考えられます。
変更の必要のあるエンティティを定義しなおしなさい。
第三正規形とは、「すべての属性が主キー以外の属性にも完全に従属している(一意に識別できる)状態」です。
第三正規化とは、主キー以外の属性に従属する属性を他のエンティティに分離することです。
「開催」エンティティの「座席数」は、セミナールームが決まれば自動的に決まるので、「開催」エンティティに存在する必要のない属性です。よって、 「開催」エンティティから取り除きます。
しかし、単に「開催」エンティティから削除してしまっては、セミナールームの座席数が分からなくなってしまいますので、新たに「セミナールーム」エンティティを追加して、そこに持たせるようにします。ここでは、ついでに「ルーム名」という属性も持たせています。
また、「開催」エンティティと「セミナールーム」エンティティとのリレーションシップは、「セミナールーム」エンティティが1に対して、「開催」エンティティが0以上の1対多となります。(コースを開催するにはセミナールームが1つだけ必要ですが、どのコースの開催でも使用されていないセミナールームがあるかもしれない)
第三正規化が終わったER図は図のようになりました。
かなりすっきりしたのですが、まだ無駄があります。導出属性が存在しているからです。導出属性とは、他の属性から導き出せる値を持つ属性です。
導出属性を探して、取り除いてください。
| ![]() |
![]() |
|
![]() |
![]() |
申込明細
|
![]() |
![]() |
受講者
|
![]() |
![]() |
| ![]() |
![]() |
開催
|
![]() |
![]() |
|
![]() |
![]() |
|
重複属性は、以下のような特徴があります。
しかし、すべての重複属性が必ずしも更新されなければいけないわけではありません。
たとえば、商品に金額があり、また売り上げ明細に金額がある場合は、金額が重複属性となります。しかし、売り上げ明細の金額をなくしてしまうと、商品の金額が改定された時に、過去の売上金額が分からなくなってしまいます。
このように、元のエンティティが更新されても、一緒に更新する必要のない、あるいは一緒に更新してはいけない、あるいは更新するのに負荷が大きい属性であれば、重複属性を持つことも検討すべきです。
属性名をドラッグするか直接入力することによって、導入すべき重複属性を追加しなさい。
| ![]() |
![]() |
|
![]() |
![]() |
申込明細
|
![]() |
![]() |
受講者
|
![]() |
![]() |
| ![]() |
![]() |
開催
|
![]() |
![]() |
|
![]() |
![]() |
|
ある販売会社S社では、自社の販売している商品の注文を次ページに示すFAXオーダシートで受け付けています。このFAXオーダシートの範囲で、エンティティを定義しER図を作成しなさい