システム開発<基本編>間違いやすいER図

DB

前回の記事で、ER図の解析方法について記載しましたが、今回は、間違いやすいER図について、

問題提起をして、解説して行きたいと思います。

 

サンプルER図(問題提起)

サンプルER図

下記のサンプルER図を見て下さい。

これは、スポーツなどでチームやメンバーを管理する「組織管理システム」のER図の一部です。

今回も全体のER図が描かれていないので、少し難しいかもしれませんが、

  • 【チーム(エンティティ:teams)】
  • 【役割(エンティティ:roles)】…選手、監督、コーチ、オーナー、通訳、ドクター 等
  • 【メンバー(エンティティ:members)】
  • 【契約(エンティティ:contracts)】
  • 【通貨(エンティティ:currencies】…日本円、ドル、ユーロ、韓国ウォン、中国元 等

と、「リレーションシップ(Relationship:関連)」になります。

利用ツール:A5:SQL Mk-2

 

検証

こちらも、開発現場で、ついついやりがちなケースかと思います。

どの部分が問題かと言うと、前回の記事と似ていて

  • 【メンバー(エンティティ:members)】

問題になります。

 

別の記事でも記載しましたが、上記のサンプルER図でも、プログラマーの立場で、

何も疑問に思わないまま、管理画面を開発する事は可能だと思います。

また、お客様の性質に寄って、「このままで問題が無い」「責任は、お客様が持つ」

判断されたら、そのまま突っ走るのも、賢明なのかもしれません。

しかし、シニアエンジニア若手エンジニアの方々が、様々な現場から指名されるような逸材

目指すのでしたら、是非、疑問を感じてデータベースやコード体系、アトリビュート

向き合って検証・解析して、問題解決してもらえればと思います。

 

では、実際に検証してみます。

先ずは、サンプルER図について。

  • 【メンバー(リソース:members)】を見る限り、メンバーチーム依存しています。
  • 現役チームメンバーを管理するだけの「組織管理システム」であれば、特に問題有りません。
  • 過去メンバーの履歴や、将来的チームと契約(ドラフト)しそうな若手メンバー海外から参入するメンバー事前登録が必要かもしれませんが、このままでは出来ません。
  • メジャーリーグ・ベースボール・ゲームメジャーリーグ・ベースボール・グッズを売るサイトで、「組織管理システム」を構築すると想定します。
  • 大谷翔平選手は、過去エンジェルスに在籍していて、現在ドジャースに在籍しています。もしかしたら、将来的チームと契約するかもしれません。
  • 【メンバー(リソース:members)】に、大谷翔平選手エンジェルスドジャースの両方を登録すると、大谷翔平選手メンバー名(固有名詞)重複登録となり、冗長化してしまいます。
  • 「データベース(テーブル)構成」は、【正規化】することが基本概念と伝えて来ましたが、【メンバー(リソース:members)】だと、【正規化】から反してしまいます。
  • 大谷翔平さん(個人)チーム依存せず、個人に依存するメンバー名(固有名詞)国籍の情報は、別テーブル(エンティティ)管理すべきです。

 

T字形ER図(問題解決)

T字形ER図

T字形ER図で解析すると、下記のER図になります。

  • 【チーム(リソース:teams)】
  • 【役割(リソース:roles)】…選手、監督、コーチ、オーナー、通訳、ドクター 等
  • 【チーム.役割(対照表:team_roles)】
  • 【メンバー(リソース:members)】
  • 【チーム.役割.メンバー(対照表:team_role_members)】
  • 【契約(イベント:contracts)】
  • 【通貨(リソース:currencies】…日本円、ドル、ユーロ、韓国ウォン、中国元 等

と、「リレーションシップ(Relationship:関連)」になります。

<論理名>

<物理名>

利用ツール:MODEL-builder version2

 

検証

では、T字形ER図で検証してみます。

  • 【メンバー(リソース:members)】のアトリビュートには、他のエンティティ依存しないメンバー名(固有名詞)国籍がが記載されています。サンプルER図のように、【チーム.役割.メンバー(対照表:team_role_members)】のアトリビュートに記載すると、【正規化】から反してしまいます。
  • 【メンバー(リソース:members)】が独立して作成されているので、将来的チームと契約(ドラフト)しそうな若手メンバー海外から参入するメンバー事前登録が出来ます。
  • 【チーム.役割.メンバー(対照表:team_role_members)】のアトリビュートには、「通称名(ニックネーム)」「背番号」「ロッカー番号」チームに依存する内容が記載されています。
  • 「通称名(ニックネーム)」ですが、「イチロー」のように、どのチームに行っても変わらない場合は、 【メンバー(リソース:members)】のアトリビュートに記載しても良いかもしれませんが、汎用的に分析して、例えばマリナーズでは「イチロー」、ヤンキースでは「スモールベースボール」、マリーンズでは「レーザービーム」など、別の呼び方が有るように考えた方が良いと思います。「通称名(ニックネーム)」が重複したからと言っても、固有名詞では無いので、【正規化】から反しているとは思えません。
  • 「背番号」ですが、契約に依存する場合は、【契約(イベント:contracts)】のアトリビュートに記載するのも良いかもしれませんが、新たに参入して来たルーキーに「背番号」を譲る事も有るので、【チーム.役割.メンバー(対照表:team_role_members)】のアトリビュートに記載しています。
  • 同じ「チーム」「背番号」が頻繁に変わる場合、歴史が必要になる「組織管理システム」であれば、【チーム.役割.メンバー(対照表:team_role_members)】とは別のエンティティ(テーブル)を作って、管理する必要が有ります。例えば、グッズ販売をするビジネスは、「背番号」の歴史がある別のエンティティ(テーブル)が必要だと思います。
  • 「背番号」は世界的(一般的)に見て数値なので、データ形式は「数値(INTまたはNumber)型」として、利用するRDBMSに合わせて下さい。
  • お客様の意向で、独自の「組織管理システム」を開発する際、「背番号」ローマ数字(Ⅰ、Ⅱ、Ⅲ…)漢字、ローマ字等で表現する場合には、データ形式は「文字列(VARCHAR)型」で設定すると良いと思います。
  • 「ロッカー番号」ですが、複数のロッカーを所有する場合は、【チーム.役割.メンバー(対照表:team_role_members)】とは別のエンティティ(テーブル)を作って、管理する必要が有ります。今回は、「1つのロッカーを所有するもの」として設定しました。
  • 「ロッカー番号」は、「No.12」「D-3」「008-2」…等、汎用的に考えてデータ形式は「文字列(VARCHAR)型」で設定しています。

以上となります。

 

今回作成したT字形ER図は、一般的に解析して作成しているので、上記のような検証と

業務分析を行って、重複排除を行ったり、どのエンティティ(テーブル)のアトリビュートに

記載した方が良いか、お客様と確認しながら、拡張して行くと良いと思います。

 

まとめ

今回は、間違いやすいER図として、問題提起と検証を行って解説しました。

開発現場で、ER図作成ツールしか頼らず、業務分析、コード体系、データベース分析を怠る

サンプルER図のような間違いをしてしまう可能性が有りますので、注意して下さい。

シニアエンジニア若手エンジニアの方々が、様々な現場から指名されるような逸材

呼ばれるように、業務分析、コード体系、データベース分析を行った上で、

ER図作成に望みましょう!!

 

コメント

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