勉強日記

チラ裏

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

www.shoeisha.co.jp


テーブルとは何か?

二次元表≠テーブル

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

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

  • 特に共通点のないレコードを寄せ集めた二次元表は「テーブル」ではない
  • テーブル
    • 同じ種類の物の集合
    • 「テーブル名はすべて複数形または複数名詞で書ける」 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

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