達人に学ぶDB設計 徹底指南書 ch3 論理設計と正規化〜なぜテーブルは分割する必要があるのか? 1/3
テーブルとは何か?
二次元表≠テーブル
テーブルとは、共通点を持ったレコードの集合である。
テーブル名は英語ならば複数形/複数名詞で書ける。そうでなければそのテーブルにはどこか間違いがある。
- 特に共通点のないレコードを寄せ集めた二次元表は「テーブル」ではない
- テーブル
- 同じ種類の物の集合
- 「テーブル名はすべて複数形または複数名詞で書ける」 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を禁止する
- 極力禁止せよ
- NULLを禁止する
- 主キー列は暗黙のNOT NULL
一意制約
- 何個でも設定できる
- cf. PKは1つ
CHECK制約
- 定義域の制限
- 数値の上限・下限
- 列挙値
テーブルと列の名前
テーブルや列の名前に日本語はご法度。
- 名前に使える文字集合
- alnum
_
- 最初はアルファベット
- 重複してはならない
コラム: 関係(リレーショナル)とは何か
pp.81-83
アドレスとポインタを追放した的な話など(略)