達人に学ぶDB設計 徹底指南書 ch3 論理設計と正規化〜なぜテーブルは分割する必要があるのか? 1/3

RDB勉強メモ

出典: 


テーブルとは何か?

二次元表≠テーブル

テーブルとは、共通点を持ったレコードの集合である。

テーブル名は英語ならば複数形/複数名詞で書ける。そうでなければそのテーブルにはどこか間違いがある。

  • 特に共通点のないレコードを寄せ集めた二次元表は「テーブル」ではない
  • テーブル

    • 同じ種類の物の集合
    • 「テーブル名はすべて複数形または複数名詞で書ける」 by ジョー・セルコ
    • 現実世界と結びついた意味を持っていること

      • これを踏み外すと間違った設計が生ずる

テーブルの構成要素

行と列

  • レコードとカラム、とも

キー

外部キーは人間の親子関係と同じ。

外部キーが設定されている場合、データの削除は子から順に操作するのが吉。

キーとなる列には、コードやIDなど表記体系の定まった固定長文字列を用いる。

  • 特定のデータを引き出すためのもの
  • 特に重要なもの

    • 主キー
    • 外部キー

主キー (primary key)

  • 必ず1つ必要で、かつ1つだけしか存在しない
  • 1つのレコードを特定できる

    • 「社員名」とかは原理的に同性同名が存在しうるから主キーにならない
  • 関連する概念

    • 候補キー

      • 主キーとして利用可能な複数候補のうち主キーでないもの
    • スーパーキー

      • 主キーのスーパーセット
      • 主キー(A,B)にCを加えて(A,B,C)にしたやつ

外部キー (foreign key)

  • テーブル間の列同士で設定する

    • 例: 社員テーブルの部署カラム(FK)が、部署マスタの部署カラム(PK)を参照する
  • 参照整合性制約

    • 例: 部署マスタに存在しない値が、間違って社員テーブルに登録されないようにする
  • 参照されるやつ: 親にあたる

    • 子は親がいないと存在できない
    • 子のいない親は存在しうる
  • 親が削除(もしくは変更)されたら、親のいない子はどうなる?

    • 設定次第

      • カスケード

        • 親のいない子も削除する
      • 削除SQLをエラーにする
  • こうした厄介な問題を考えないようにテーブル操作するのが一番

    • 子を先に削除する

どのような値をキーにするか

  • 可変長文字列はよくない

    • 同じ名前でも微妙に異なる表記になったりする
  • 表記体系の定まった固定長文字列を使え

制約

テーブル定義において、列には可能な限りNOT NULL制約を付加する。

  • いろいろある

    • 参照整合性制約(前述)
    • NOT NULL制約
    • 一意制約
    • CHECK制約

NOT NULL制約

  • NULL

    • 値がないことのマーク

      • NULLという値があるわけではない
  • NULLはいろいろと厄介

    • 【補】排中律が破れたりとか
  • NOT NULL制約

    • NULLを禁止する

      • 極力禁止せよ
  • 主キー列は暗黙のNOT NULL

一意制約

  • 何個でも設定できる

    • cf. PKは1つ

CHECK制約

  • 定義域の制限

    • 数値の上限・下限
    • 列挙値

テーブルと列の名前

テーブルや列の名前に日本語はご法度。

  • 名前に使える文字集合

    • alnum
    • _
  • 最初はアルファベット
  • 重複してはならない

    • 範囲

      • テーブルの中では、同じ列名は使用不可
      • ドメイン(DBMSによってはスキーマとも)の中では、同じテーブル名は使用不可

コラム: 関係(リレーショナル)とは何か

pp.81-83

アドレスとポインタを追放した的な話など(略)