0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DB設計について③

Last updated at Posted at 2024-12-06

正規化

DBをマスターしたい

前回に引き続き、DBの基本知識を学習している
今回は正規化についてまとめる

参考文献

達人に学ぶDB設計徹底指南書


目次

  1. 基礎用語
  2. 正規化とは
  3. ストレージの冗長構成
  4. バックアップ設計

1.基礎用語

テーブルの構成要素

image.png

参考サイト:株式会社システムインテグレーター

  1. テーブル
     共通点を持ったレコードの集合体
     「テーブル名は複数形または複数名詞で書ける」
     →そうでなければテーブルにはどこか間違いがある
  2. カラム
     「列」のこと、属性ともいう
  3. レコード
    「行」のこと
  4. フィールド
     「セル」のこと

キー

  1. 主キー
     別名は「プライマリキー」と呼ぶ
     テーブルに必ず1つ存在しなければならず、かつ1つしか存在しない
    一意に識別する=値を指定すれば必ず1行のレコードを特定できる
  2. 外部キー
     テーブルに対して一種の「制約」を課すこと(参照整合性制約)

制約

  1. NOT NULL制約
     データを入力せず空欄の状態をNULLという
     しかし、SQL上では問題を引き起こす厄介者
     =可能な限りデータはNULLにしない(データベース設計における大方針)
  2. 一意制約
     列の組について一意性を求める制約
  3. CHECK制約
     列の取りうる値の範囲を制限するための制約

命名規則

  • 名前に使える文字集合
     半角のアルファベット、半角数字、アンダーバー
     日本語は原則、使わない
  • 最初はアルファベット
     先頭は必ずアルファベットを使う
  • 名前は重複してはならない

2.正規化とは

正規化の定義

 正規化されたデータ形式を正規形という
 正規形はデータの冗長性を排除し、一貫性と効率性を保持するための形を指す

  • 冗長性
     一つの情報が複数テーブルに存在して無駄な領域と面倒な更新処理が発生する状態
  • 非一貫性
     データの不整合が発生したり、そもそもデータを登録することのできない状態

3.第一正規形

 一つのセルの中には一つの値しか含まない

(Before)

社員ID 社員名
000A 加藤 達夫
信二
000B 藤本
001F 三島
飛鳥
洋子

(After)

社員ID 社員名
000A 加藤 達夫
000A 加藤 信二
000B 藤本
001F 三島
001F 三島 飛鳥
001F 三島 洋子

これだとまだ問題がある
1つ目は主キーが決められないこと
 →決めるなら「社員ID+社員名+子」だが子にはNULLがある
2つ目は2つのエンティティ情報を持っていること
 →社員と子供の情報があり、テーブルの意味やレコードの単位をすぐに理解できない

(After ver2.0)テーブルを分割する
 →社員テーブルと子供テーブルに分ける

社員ID 社員名
000A 加藤
000B 藤本
001F 三島
社員ID
000A 達夫
000A 信二
001F
001F 飛鳥
001F 洋子

4.第二正規形

部分関数従属とは

主キーの一部の列に対して従属する列がある場合=部分関数従属
ex)「会社コード」から「会社名」がわかる

主キーを構成する全ての列に従属性がある場合=完全関数従属
→第2正規形はテーブル内の部分関数従属を解消し、完全関数従属のみのテーブルを作ること

(Before)

会社コード 会社名 社員ID 社員名 年齢 部署コード 部署名
C0001 A商事 000A 山下 40 D01 開発
C0001 A商事 000B 高橋 32 D02 人事
C0001 A商事 001F 小山 50 D03 営業
C0002 B工業 000A 斎藤 21 D03 営業
C0002 B工業 009F 田崎 33 D01 開発
C0002 B工業 010A 柳田 46 D04 総務

(After)

会社コード 社員ID 社員名 年齢 部署コード 部署名
C0001 000A 山下 40 D01 開発
C0001 000B 高橋 32 D02 人事
C0001 001F 小山 50 D03 営業
C0002 000A 斎藤 21 D03 営業
C0002 009F 田崎 33 D01 開発
C0002 010A 柳田 46 D04 総務
会社コード 会社名
C0001 A商事
C0002 B工業

異なるレベルの実体(エンティティ)をきちんと分離させるイメージ

4.第三正規形

推移的関数従属

テーブル内部に存在する段階的な従属関係のこと
ex)「会社コード、社員ID」→「部署コード」→「部署名」
 会社コードがあって初めて部署名のリストができる
 →まだ所属している人がいない部署の登録ができない

(After)

会社コード 社員ID 社員名 年齢 部署コード
C0001 000A 山下 40 D01
C0001 000B 高橋 32 D02
C0001 001F 小山 50 D03
C0002 000A 斎藤 21 D03
C0002 009F 田崎 33 D01
C0002 010A 柳田 46 D04

会社コード 会社名
C0001 A商事
C0002 B工業
C0003 C建設
部署コード 部署名
D0001 開発
D0002 人事
D0003 営業
D0004 総務
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?