データモデリング

データベースを作るとき、最初にするのは、業務のどんなデータをどんな形で入れるかを決めることです。この設計をデータモデリングといいます。このガイドでは、モデリングの段階とER図の描き方から始めて、エンティティ・属性・リレーションシップ・識別子を決め、正規化で整えたあと、性能のためにあえて重複を持たせる非正規化までを順番に見ていきます。例には社員・部署・注文のようなよくある業務を使い、章ごとに自分で操作できる図を用意しました。こうして作ったテーブルからデータを取り出すSQLは、SQLの基本のガイドで扱います。

01

データモデリングとER図:業務をデータに置き換える設計図

家を建てるとき、いきなりレンガを積み始めることはありません。部屋がいくつで、どこにドアを付けるかという設計図から描きます。データベースも同じです。業務にどんなデータがあり、それらがどうつながっているかを先に描いておく作業をデータモデリングといい、その成果物がデータモデルです。

モデリングには3つの性格があります。

  • 抽象化:現実の数多くの事実から共通点を取り出し、一定の形式で表す
  • 単純化:決められた表記法で、誰でも簡単に理解できるようにする
  • 明確化:あいまいな部分をなくし、1つの意味にしか読めないようにする

業務を見る観点も3つあります。何を管理するのか(データ観点)、どんな仕事をするのか(プロセス観点)、その仕事がデータにどんな影響を与えるのか(データとプロセスの相関観点)です。データモデリングは、このうちデータ観点が中心です。

概念 → 論理 → 物理、3つの段階で具体化

設計図も、最初は全体像を描き、だんだん細かく描いていきます。モデリングも3つの段階に分けます。

段階すること特徴
概念モデリング業務全体から中心となるエンティティとその関係を見つける抽象度がいちばん高い。全社的な観点の全体像
論理モデリングキー・属性・リレーションシップを正確に決め、正規化する特定のDBMSに依存しない。再利用性がいちばん高い
物理モデリング実際のDBMSに合わせてテーブル・列のデータ型・インデックスを決める性能と記憶領域を考慮する。抽象度がいちばん低い

3層スキーマとデータ独立性

同じデータでも、見る人によって必要な姿が違います。ANSI/SPARCは、データベースを3つの層に分けて考えます。層に分ける目的は、ある層を変えてもほかの層が影響を受けにくくすること、つまりデータ独立性です。

層誰の観点か説明
外部スキーマ利用者・アプリケーションそれぞれが必要な部分だけを見た姿(ビュー)。複数ありうる
概念スキーマ組織全体すべてのデータと関係を1つに統合した姿。1つだけ
内部スキーマ記憶装置データが実際にどう格納されるか(ファイル・インデックスの構造)

外部と概念の間が切り離されていて、概念スキーマが変わっても利用者の画面はそのままであることを論理的データ独立性、概念と内部の間が切り離されていて、格納方法を変えても概念スキーマはそのままであることを物理的データ独立性といいます。

モデリングを誤ると起きる問題も、3つにまとめられます。同じデータを何か所にも持つ重複、業務が少し変わっただけでモデルを大きく直さなければならない非柔軟性、互いに関連するデータのつじつまが合わなくなる非一貫性です。

ER図:エンティティ・リレーションシップ・属性で描く図

データモデルはふつうER図(ERD、Entity Relationship Diagram)で描きます。構成要素は、エンティティ、リレーションシップ(関係)、属性の3つです。表記法は、関係線の端を鳥の足の形で描くIE表記法と、任意の関係を点線で描くBarker表記法がよく使われます。ふつうは次の順番で描きます。

  1. エンティティを描く
  2. エンティティを適切に配置する — 重要なエンティティを左上に
  3. エンティティの間にリレーションシップを結ぶ
  4. リレーションシップ名を書く
  5. リレーションシップに参加する数(1つ・複数)を書く
  6. リレーションシップが必ず必要か(必須・任意)を書く

下の図で段階を進めながら、部署と社員のER図がどう出来上がっていくかを見てください。同じモデルをBarker表記法に切り替えることもできます。

部署PK部署コード部署名所在地社員PK社員番号氏名電話番号部署コード (FK)含む所属するオプショナリティ (○ 任意、| 必須)

6. オプショナリティを書く — IE表記法

読み方
各部署は複数の社員を含むことがある / 各社員は必ず1つの部署に所属する

段階を進めながらER図が描かれる順番を見て、同じモデルをBarker表記法にも切り替えてみてください。緑はその段階で新しく描いた部分です。

リレーションシップが必ず必要かを書きます。社員は必ず1つの部署に所属するので部署側に縦線(必須)を、部署は社員がいなくてもよいので社員側に丸(任意)を付けます。これで「各部署は複数の社員を含むことがある」「各社員は必ず1つの部署に所属する」と読めます。

問題文にこんな表現があれば → これを選ぶ

  • “抽象度がいちばん高いモデリング”概念モデリング
  • “DBMSに依存せず、再利用性がいちばん高いモデル”論理モデル
  • “性能・記憶領域を考慮してDBMSに合わせる段階”物理モデリング
  • “概念スキーマが変わっても利用者の画面はそのまま”論理的データ独立性
  • “格納構造が変わっても概念スキーマはそのまま”物理的データ独立性
  • “ER図の3つの構成要素”エンティティ・リレーションシップ・属性
  • “ER図で重要なエンティティを置く場所”左上

広告

02

エンティティと属性

ER図の箱の1つ1つがエンティティで、箱の中に書くのが属性です。まずは、何をエンティティにし、何を属性にするかを決めます。

エンティティ:業務で管理する対象の集まり

エンティティは、業務に必要で、継続して管理すべき対象です。社員、部署、注文のように名前を付けられるものです。1つのエンティティは1つ1つのものではなく集合だという点が大事です。社員エンティティは社員1人ではなく社員全体のことで、その中の1人1人をインスタンスと呼びます。

エンティティになるには、次の条件を満たす必要があります。

  • 業務で必要とされ、管理しようとする情報である
  • インスタンスを1つずつ区別できる識別子がある
  • インスタンスが2つ以上ある — 1つしかないならエンティティにする理由がない
  • 業務プロセスがそのエンティティを使う(作る・読む・直す)
  • 属性を持つ
  • ほかのエンティティとのリレーションシップが少なくとも1つある — コード・統計のエンティティのように、あえてリレーションシップを省く例外もある

エンティティは2つの基準で分類します。

基準分類例
形があるか有形エンティティ — 物理的な形がある社員、商品、講師
概念エンティティ — 形はないが管理する概念組織、保険商品
事件エンティティ — 業務を行う中で発生する注文、請求、受講申込
いつ発生するか基本(キー)エンティティ — ほかのエンティティなしに自ら発生する顧客、商品、部署
中心エンティティ — 基本エンティティから発生し、業務の中心になる注文、契約
行為エンティティ — 2つ以上の親から発生し、頻繁に変わり、量が増えていく注文明細、変更履歴

名前は現場で使う言葉で、略語を使わず、単数形の名詞で付け、モデルの中で重ならないようにします。「注文」の代わりに「注文一覧」のような複数を表す名前にはしません。

属性:エンティティを説明する、それ以上分けられない性質

属性は、エンティティが持つ性質のうち業務に必要で、意味のうえでそれ以上分けないものです。社員の氏名・給与が属性で、健太というインスタンスが氏名属性に持つ「健太」が属性値です。4つの関係は次のようにまとめられます。

  • 1つのエンティティは、2つ以上のインスタンスの集合である
  • 1つのエンティティは、2つ以上の属性を持つ
  • 1つの属性は、インスタンスごとに値を1つだけ持つ — 値が複数あるなら別のエンティティに切り出す

下の図で用語を切り替えながら、論理モデルの言葉がテーブルのどこにあたるかを見てください。

論理モデル(ER図)

社員

PK社員番号

氏名

部署コード

給与

物理モデル(テーブル)とデータ

PKEMP_NONAMEDEPT_CODESALARY
101葵D10300
102健太D10250
103翔太D20400
104結衣D20350

エンティティ = テーブル

用語

用語を選んでみてください。論理モデルの言葉がテーブルのどこにあたるかが緑で示されます。

業務で管理すべき対象の集まりです。「社員」というエンティティは社員1人のことではなく、社員全体をまとめて呼ぶ名前で、物理モデルではテーブルになります。

属性もいくつかの基準で分類します。

基準分類説明
特性基本属性業務でもともと使っている値 — 氏名、注文日
設計属性設計の中で新しく作った値 — 商品コード、連番
派生属性ほかの属性から計算した値 — 注文合計。元の値と食い違うおそれがあるので、少ないほどよい
構成方式PK属性 / FK属性 / 一般属性識別子か、ほかのエンティティから来たか、どちらでもないか
分けられるか単純属性 / 複合属性年齢のように1つ / 住所(都道府県・市区町村・町名)のように複数に分かれる
値がいくつあるか単一値属性 / 多値属性マイナンバーのように1つ / 電話番号のように複数 — 多値はエンティティに分ける

属性が取りうる値の範囲をドメインといいます。データ型とサイズ、制約で決めます。たとえば「成績」のドメインは、0以上100以下の整数です。

問題文にこんな表現があれば → これを選ぶ

  • “インスタンスが1つしかない対象”エンティティにしない
  • “社員・物品のように形があるエンティティ”有形エンティティ
  • “注文・請求のように業務を行う中で発生するエンティティ”事件エンティティ
  • “ほかのエンティティなしに自ら発生するエンティティ”基本(キー)エンティティ
  • “2つ以上の親から発生し、増え続けるエンティティ”行為エンティティ
  • “ほかの属性から計算して求めた属性”派生属性 — 整合性のため最小限に
  • “電話番号のように値が複数ある属性”多値属性 → エンティティに分ける
  • “属性が取りうる値の範囲”ドメイン

Pro限定

ここまでは無料で読めます

残りの3章はPro会員向けです。各章に3D図解と「問題文にこんな表現があれば」の整理が続き、最後の章では実際に解いて確かめられます。

  1. 03リレーションシップと識別子
  2. 04正規化
  3. 05非正規化とモデルの考慮事項

広告

PasslyExam

概念をつかんだら、次は試験形式の問題で確かめましょう

PasslyExamは、各資格の出題範囲に合わせて作成したオリジナルの練習問題・解説・本番形式の模擬試験を提供しています。正解の選択肢がなぜ正しく、似た選択肢がなぜ誤りなのかまで解説します。登録すると毎日無料で練習問題に取り組めます。

同じ分野のほかの解説

ほかの分野の解説

コンセプト解説の一覧を見る