Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【基本情報対策】正規化とE-R図

 【基本情報対策】正規化とE-R図

Avatar for 赤神青空

赤神青空 PRO

October 30, 2026

Video

More Decks by 赤神青空

Other Decks in Programming

Transcript

  1. ▪並列は、2台とも止まったときだけ止まる 前回のクイズの答えは「C」 前回のクイズ 稼働率 0.9 の装置を2台、並列につないだ システムの稼働率は? 並列は、どちらか1台が動けば動く。 ⽌まるのは2台とも⽌まったときで、 (1−0.9)×(1−0.9)=0.01。

    稼働率は 1−0.01=0.99 答えは C 今ココ おさらい . A 直列と取り違えたとき(0.9×0.9) . B 1台のときのまま . C 1−(1−0.9)×(1−0.9) . D ⾜してしまったとき。稼働率は1を超えない 2/17
  2. ▪正規化とE-R図、テーブル設計の基本 今回の話 ① E-R図とキー エンティティ‧関連‧主キー ② 正規化 第1〜第3正規形 ③ 実務では

    設計のレビューと外部キー制約 今回いちばん持ち帰ってほしいこと 正規化は、1つの事実を1か所にだけ書くための⼿順 今ココ はじめに 3/17
  3. ▪エンティティ・属性・リレーションシップ E-R図 顧客 顧客番号 顧客名 多 1対多 受注 受注番号 受注⽇

    多 多 多対多 商品 商品番号 商品名 単価 エンティティ 管理したい対象(箱) 属性 エンティティが持つ項⽬(箱の中) リレーションシップ エンティティどうしの関連(線) 1つの受注に商品がいくつも、1つの商品も受注がいくつも = 多対多 今ココ E-R図 4/17
  4. ▪行を決める列と、ほかの表を指す列 主キー・候補キー・外部キー 顧客 顧客番号 C C 受注 受注番号 主キー 顧客名

    ⻘葉商店 ⼭⽥書店 受注⽇ / / / ⾏を1つに決める列(または列の組) 重複できず、空(NULL)にもできない 候補キー 顧客番号 C C C 実線の下線:主キー 破線の下線:外部キー 今ココ キー ⾏を1つに決められる、最⼩限の列(の組) 主キーは、候補キーの中から1つ選んだもの 外部キー ふつうは、ほかの表の主キーを参照する列 受注の顧客番号は、顧客の顧客番号を指す 6/17
  5. ▪1つの受注の行に、商品が繰り返し入っている 正規化する前の受注の表 受注番号 受注⽇ 顧客番号 顧客名 / C ⻘葉商店 /

    / C C ⼭⽥書店 ⻘葉商店 繰り返し(1つの受注に、商品が何個も) 商品番号 P P P P 商品名 ノート ペン ノート 消しゴム 単価 数量 繰り返し項⽬がある形 = ⾮正規形 このままでは、どのマスにも値が1つだけ、という関係データベースの表の形にならない 今ココ 正規化 7/17
  6. ▪繰り返しをなくして、1行に1つの商品にする 第1正規形 受注番号 商品番号 P P P P 受注⽇ /

    / / / 顧客番号 C C C C 顧客名 ⻘葉商店 ⻘葉商店 ⼭⽥書店 ⻘葉商店 商品名 ノート ペン ノート 消しゴム 単価 数量 第1正規形:どのマスにも値は1つだけ 繰り返しをなくし、1⾏に1つの商品にした 主キーは、受注番号と商品番号の組 今ココ 正規化 8/17
  7. ▪ある項目が決まると、別の項目が1つに決まる 関数従属 X → Y:X の値が決まると、Y の値が1つに決まる(Y は X に関数従属する)

    商品番号 商品名‧単価 受注番号 受注⽇‧顧客番号 顧客番号 受注番号+商品番号 数量 2つそろって、はじめて決まる 今ココ 正規化 P なら、いつもノート‧200円 顧客名 9/17
  8. ▪部分関数従属をなくす 第2正規形 主キー ⼀部だけで決まる 受注⽇‧顧客番号‧顧客名 受注 受注番号 商品番号 全体で決まる ⼀部だけで決まる

    数量 商品名‧単価 主キーの⼀部だけで決まる項⽬がある = 部分関数従属 受注明細 商品 受注番号 受注⽇ 顧客番号 顧客名 受注番号 商品番号 数量 商品番号 商品名 単価 実線の下線:主キー 破線の下線:外部キー 今ココ 正規化 10/17
  9. ▪推移関数従属をなくす 第3正規形 受注(第2正規形) 受注番号 受注⽇ 主キーで決まる 顧客番号 顧客名 顧客番号で決まる 受注番号

    → 顧客番号 → 顧客名 キーではない項⽬(顧客番号)を経由して決まる = 推移関数従属 受注 顧客 受注番号 受注⽇ 顧客番号 受注には、顧客番号だけを残す(外部キー) 今ココ 正規化 顧客番号 顧客名 実線の下線:主キー 破線の下線:外部キー 11/17
  10. ▪1つの事実が、1か所にだけある 第3正規形まで分けた結果 顧客 顧客番号 C C 顧客名 ⻘葉商店 ⼭⽥書店 多

    受注 受注番号 受注⽇ 顧客番号 / C / C / C 1つの事実を、1か所にだけ書く 多 受注明細 受注番号 商品番号 数量 P P P P 多 商品 商品番号 商品名 単価 P ノート P ペン P 消しゴム 実線の下線:主キー 破線の下線:外部キー 顧客名は顧客に、単価は商品に、数量は受注明細に。E-R図と同じ4つになる 今ココ 正規化 12/17
  11. ▪同じ情報が何か所にもあると、ずれる テーブル設計のレビューで見るところ 同じ情報を、2か所以上に書いていないか 受注番号 商品番号 P P P P 顧客番号

    C C C C ずれる‧登録できない‧消える 顧客名 ⻘葉ストア ⻘葉商店 ⼭⽥書店 ⻘葉商店 修正‧追加‧削除のときの不都合(更新時異状とも) 正規化すると、起きにくくなる 今ココ 実務では 修正:1か所だけ直すと、ずれる 受注1001 の1⾏⽬だけ「⻘葉ストア」に直した 同じ C なのに、名前が2つになる 追加:まだ注⽂の無い顧客を登録できない 顧客だけの⾏は、主キーの受注番号‧商品番号が空になる 削除:受注1002 を消すと ⼭⽥書店の情報も、⼀緒に消えてしまう 13/17
  12. ▪ただし、理由を決めて あえて正規化を崩すこともある 受注に、顧客名もコピーして持つ 受注番号 顧客番号 C C C 顧客名 ⻘葉商店

    ⼭⽥書店 ⻘葉商店 受注番号 → 顧客番号 → 顧客名 が戻る 第3正規形ではなくなる(推移関数従属) 集計した値を、別の表に持つ 顧客番号 C C 顧客名 ⻘葉商店 ⼭⽥書店 売上合計 1,420円 400円 売上合計は、元の表から計算できる値 表は正規形でも、同じ情報を重ねて持つ 崩すなら、理由を決めておく なぜ崩すか(表をつなぐ‧集計するのが毎回重い、など) どれが元のデータで、ずれたらいつ作り直すか 今ココ 実務では 14/17
  13. ▪つながりを、データベースに守らせる 外部キー制約 顧客 顧客番号 C C 受注 受注番号 無い顧客番号は、⼊れられない 顧客名

    ⻘葉商店 ⼭⽥書店 受注⽇ / / / 受注に(1004, 10/4, C )を追加しようとする 顧客に C が無いので、エラーになる 顧客番号 C C C 参照されている顧客を消すとき(PostgreSQL の例) 受注1002 が、顧客の C を参照している 何も指定しない → エラーで⽌まる(NO ACTION) CASCADE → 参照している受注も⼀緒に消える SET NULL → 受注の顧客番号を空にする(空を許す列なら) 実線の下線:主キー 破線の下線:外部キー 今ココ 実務では 15/17